Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Postgres:with子句中的条件语句_Sql_Database_Postgresql_Bulkinsert - Fatal编程技术网

Sql Postgres:with子句中的条件语句

Sql Postgres:with子句中的条件语句,sql,database,postgresql,bulkinsert,Sql,Database,Postgresql,Bulkinsert,我正在尝试将Oracle迁移到Postgres。 在Oracle中,只要有批量收集功能,我就创建了纯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'

我正在尝试将Oracle迁移到Postgres。 在Oracle中,只要有批量收集功能,我就创建了纯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; 

请提供帮助。

第二个函数可以用普通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;

你能发布你的PostgreSQL版本的第二个函数吗?它会给出什么错误?从我所看到的,这应该没有任何问题,除了我所知道的pg中的大容量收集没有等价物。下面的代码我尝试在Postgres中执行,这给了我语法错误。在VARCHAR中创建或替换函数get_st_tax a_st_type将表tax_id整数返回为$$,如果a_stream_type='top stories',则将v_tax_列表作为SELECT t.tax_id FROM mobile_st_tax t SELECT tax_id FROM v_tax_list;否则,将v_tax_列表作为从mobile_st_tax t中选择t.tax_id,其中t.stream_type=a_stream_type从v_tax_列表中选择tax_id;如果结束;$$语言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;