Oracle到PostgreSQL查询转换,带字符串\u到\u数组()
我在Oracle中有以下查询:Oracle到PostgreSQL查询转换,带字符串\u到\u数组(),sql,oracle,postgresql,set-returning-functions,unnest,Sql,Oracle,Postgresql,Set Returning Functions,Unnest,我在Oracle中有以下查询: SELECT to_number(a.v_VALUE), b.v_VALUE FROM TABLE(inv_fn_splitondelimiter('12;5;25;10',';')) a JOIN TABLE(inv_fn_splitondelimiter('10;20;;', ';')) b ON a.v_idx = b.v_idx 这给了我这样的结果: 我想将查询转换为Postgres。我尝试过这样的查询:
SELECT to_number(a.v_VALUE), b.v_VALUE
FROM TABLE(inv_fn_splitondelimiter('12;5;25;10',';')) a
JOIN TABLE(inv_fn_splitondelimiter('10;20;;', ';')) b
ON a.v_idx = b.v_idx
这给了我这样的结果:
我想将查询转换为Postgres。我尝试过这样的查询:
SELECT UNNEST(String_To_Array('10;20;',';'))
我也尝试过:
SELECT a,b
FROM (select UNNEST(String_To_Array('12;5;25;10;2',';'))) a
LEFT JOIN (select UNNEST(String_To_Array('12;5;25;10',';'))) b
ON a = b
但是没有得到正确的结果。我不知道如何编写完全等同于Oracle版本的查询。有人吗?在表达式
中选择一个a
不是列,而是表别名的名称。因此,表达式选择一个完整的行元组(尽管只有一列),而不是一列
您需要为派生表定义正确的列别名。还建议仅在from子句中使用set返回函数,而不要在select列表中使用
如果您没有使用9.4,则需要使用窗口函数生成“索引”。如果你在9.4上,那么欧文的答案要好得多
SELECT a.v_value, b.v_value
FROM (
select row_number() over () as idx, -- generate an index for each element
i as v_value
from UNNEST(String_To_Array('12;5;25;10;2',';')) i
) as a
JOIN (
select row_number() over() as idx,
i as v_value
from UNNEST(String_To_Array('10;20;;',';')) i
) as b
ON a.idx = b.idx;
9.4中的另一种方法是使用带顺序的选项生成行索引,以防需要索引值:
select a.v_value, b.v_value
from regexp_split_to_table('12;5;25;10;2',';') with ordinality as a(v_value, idx)
left join regexp_split_to_table('10;20;;',';') with ordinality as b(v_value, idx)
on a.idx = b.idx
从Postgres9.4开始,您可以使用多个数组并行取消对它们的检测:
SELECT *
FROM unnest('{12,5,25,10,2}'::int[]
, '{10,20}' ::int[]) AS t(col1, col2);
就这些<代码>空值
值会自动填入右侧缺少的元素
如果参数是以字符串形式提供的,请先使用转换。比如:
SELECT *
FROM unnest(string_to_array('12;5;25;10', ';')
, string_to_array('10;20' , ';')) AS t(col1, col2);
有关旧版本的更多详细信息和替代解决方案: