【问题标题】:Postgres: Conditional statement in with clausePostgres:with子句中的条件语句
【发布时间】:2017-08-21 12:56:40
【问题描述】:

我正在尝试将 Oracle 迁移到 Postgres。 无论在 Oracle 中哪里有批量收集功能,我都创建了普通的 SQL 函数: 喜欢

CREATE OR REPLACE FUNCTION get_pub_access_tax(a_person_id mobile_user.id%TYPE)
RETURNS TABLE (tax_id integer) AS 
$$
    WITH v_pub_tax AS (SELECT tax_id FROM mobile_pub_tax)
    select tax_id from v_pub_tax ;

$$ LANGUAGE sql;

但是在 Oracle 中有一个场景是根据条件获取数据:(见下面的例子)

  FUNCTION get_st_tax(
    a_st_type IN VARCHAR2)
  RETURN mmt_array
  IS
   v_tax_list  mmt_array := mmt_array();
  BEGIN
    IF a_st_type = 'top-stories' THEN
      SELECT t.tax_id BULK COLLECT INTO v_tax_list
      FROM mobile_st_tax t;
      RETURN v_tax_list;
    ELSE
      SELECT t.tax_id BULK COLLECT INTO v_tax_list
      FROM mobile_st_tax t WHERE t.stream_type=a_stream_type;
      RETURN v_tax_list;
    END IF;
  END;

我们如何将上述 Oracle 代码转换为 Postgres?

我尝试使用 if 条件,但出现语法错误(如下代码)。 下面的代码我尝试在 Postgres 中执行,这给了我语法错误。

CREATE OR REPLACE FUNCTION get_st_tax ( a_st_type IN VARCHAR) 
RETURNS TABLE (tax_id integer) AS 
$$  
    IF a_stream_type = 'top-stories' THEN
        WITH v_tax_list AS (
        SELECT t.tax_id FROM mobile_st_tax t)
        SELECT tax_id FROM v_tax_list;
    ELSE
        WITH v_tax_list AS (
        SELECT t.tax_id FROM mobile_st_tax t WHERE t.stream_type=a_stream_type)
        SELECT tax_id FROM v_tax_list;   
    END IF;

$$ LANGUAGE SQL; 

请帮忙。

【问题讨论】:

  • 你能发布你的第二个函数的 PostgreSQL 版本吗?它给出了什么错误?据我所知,这应该没有任何问题,除了 pg 中的 bulk collect 没有等价物(据我所知)。
  • 下面的代码我尝试在 Postgres 中执行,这给了我语法错误。创建或替换函数 get_st_tax (a_st_type IN VARCHAR) 返回表 (tax_id integer) AS $$ IF a_stream_type = 'top-stories' THEN WITH v_tax_list AS (SELECT t.tax_id FROM mobile_st_tax t) SELECT tax_id FROM v_tax_list; ELSE WITH v_tax_list AS (SELECT t.tax_id FROM mobile_st_tax t WHERE t.stream_type=a_stream_type) SELECT tax_id FROM v_tax_list;万一; $$ 语言 SQL;

标签: sql database postgresql bulkinsert


【解决方案1】:

第二个功能可以用纯sql完成:

create function get_st_tax(a_st_type text)
returns int[] as $$
    select array_agg(t.tax_id)
    from mobile_st_tax t 
    where 
        t.stream_type = a_stream_type and a_st_type <> 'top_stories'
        or
        a_st_type = 'top-stories'
    ;
$$ language sql;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2022-11-10
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多