簡體   English   中英

Postgres:with子句中的條件語句

[英]Postgres: Conditional statement in with clause

我正在嘗試將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; 

請幫助。

第二個功能可以在普通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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM