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;
我正在尝试将 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;