使用string_to_array()进行Oracle到PostgreSQL的查询转换

Dha*_*tel 3 sql oracle postgresql unnest set-returning-functions

我在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
Run Code Online (Sandbox Code Playgroud)

这给我的结果如下:

在此输入图像描述

我想将查询转换为Postgres.我尝试过如下查询:

SELECT UNNEST(String_To_Array('10;20;',';'))
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

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
Run Code Online (Sandbox Code Playgroud)

但没有得到正确的结果.
我不知道如何编写完全等同于Oracle版本的查询.任何人?

Erw*_*ter 7

从Postgres 9.4开始,您可以使用unnest()多个数组来并行取消它们:

SELECT *
FROM   unnest('{12,5,25,10,2}'::int[]
            , '{10,20}'       ::int[]) AS t(col1, col2);
Run Code Online (Sandbox Code Playgroud)

就这样.NULL值将自动填入右侧缺少的元素.

如果参数以字符串形式提供,string_to_array()请先转换.喜欢:

SELECT *
FROM   unnest(string_to_array('12;5;25;10', ';')
            , string_to_array('10;20'     , ';')) AS t(col1, col2);
Run Code Online (Sandbox Code Playgroud)

更多细节和旧版本的替代解决方案: