使用 string_to_array() 的 Oracle 到 PostgreSQL 查询转换
Oracle to PostgreSQL query conversion with string_to_array()
我在 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 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 版本完全等效的查询。有人吗?
在表达式 select a
中,a
不是列,而是 table 别名的名称。因此,表达式 select 是一个完整的行元组(尽管只有一列),而不是一列。
您需要为派生的 table 定义适当的列别名。还建议仅在 from 子句中而不是在 select 列表中使用集合返回函数。
如果您使用的不是 9.4,则需要使用 window 函数生成 "index"。如果您使用的是 9.4,那么 Erwin 的回答会好得多。
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 中的另一种方法是使用 with ordinality
选项生成行索引,以防您确实需要索引值:
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
从 Postgres 9.4 开始,您可以将 unnest()
与多个数组一起使用以并行解除它们的嵌套:
SELECT *
FROM unnest('{12,5,25,10,2}'::int[]
, '{10,20}' ::int[]) AS t(col1, col2);
就是这样。 NULL
会自动为右侧缺失的元素填充值。
如果参数以字符串形式提供,请先用string_to_array()
转换。喜欢:
SELECT *
FROM unnest(string_to_array('12;5;25;10', ';')
, string_to_array('10;20' , ';')) AS t(col1, col2);
更多详细信息和旧版本的替代解决方案:
我在 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 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 版本完全等效的查询。有人吗?
在表达式 select a
中,a
不是列,而是 table 别名的名称。因此,表达式 select 是一个完整的行元组(尽管只有一列),而不是一列。
您需要为派生的 table 定义适当的列别名。还建议仅在 from 子句中而不是在 select 列表中使用集合返回函数。
如果您使用的不是 9.4,则需要使用 window 函数生成 "index"。如果您使用的是 9.4,那么 Erwin 的回答会好得多。
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 中的另一种方法是使用 with ordinality
选项生成行索引,以防您确实需要索引值:
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
从 Postgres 9.4 开始,您可以将 unnest()
与多个数组一起使用以并行解除它们的嵌套:
SELECT *
FROM unnest('{12,5,25,10,2}'::int[]
, '{10,20}' ::int[]) AS t(col1, col2);
就是这样。 NULL
会自动为右侧缺失的元素填充值。
如果参数以字符串形式提供,请先用string_to_array()
转换。喜欢:
SELECT *
FROM unnest(string_to_array('12;5;25;10', ';')
, string_to_array('10;20' , ';')) AS t(col1, col2);
更多详细信息和旧版本的替代解决方案: