将查询Oracle转换为Postgresql

时间:2018-10-23 06:24:26

标签: sql postgresql split postgresql-9.5

在Oracle中

(select regexp_substr('a,,b','[^,]+', 1, level) 
 from dual 
 connect by regexp_substr('a,,b', '[^,]+', 1, level) is not null);

它给了我输出

a
b

在Postgresql中

select regexp_split_to_table( 'a,,b',',');

它给了我输出

a

b

它在ab之间给出空白行。 有人可以建议我如何获得类似Oracle的输出。

2 个答案:

答案 0 :(得分:0)

在oracle中,您正在搜索匹配项,而不是拆分。在Postgres中做同样的事情:

SELECT m[1] FROM regexp_matches('a,,b', '[^,]+', 'g') AS T(m);

编辑:感谢a_horse_with_no_name和TimBiegeleisen使我注意到它正在每行中返回一个数组。

答案 1 :(得分:0)

对于这样的简单拆分/嵌套,string_to_array是一个更好的选择。处理正则表达式非常昂贵。

如果将返回集合的函数放在FROM子句中(应该放在其中),则可以过滤出空行:

SELECT t.m
FROM unnest(string_to_array('a,,b', ',')) as t(m)
where nullif(trim(t.m),'') is not null;

nullif(trim(t.m),'')还将处理a, ,b之类的输入,并将空字符串视为null。

在线示例:https://rextester.com/VDWUEM85289