Postgres - 选择没有表的rownumber,但选择函数

时间:2016-04-29 23:20:01

标签: postgresql split recursive-query window-functions connect-by

我试图得到这样的结果:

rownumber | value
    1     |   a
    2     |   b
    3     |   c

没有任何表格,我会做这样的事情:

WITH RECURSIVE t(rownumber, value) AS (
select 1, regexp_split_to_table('a, b, c', ',')
UNION ALL
SELECT rownumber+1, regexp_split_to_table('a, b, c',',') FROM t 
)
SELECT * FROM t limit (select count(*) from regexp_split_to_table('a, b, c', ','));

但结果并不像预期的那样。

我这样做的原因是因为价值' a,b,c'应该是一些变数。

在Oracle中,SQL看起来像这样:

SELECT value  FROM (
        SELECT ROWNUM AS rownumber, trim(REGEXP_SUBSTR('a, b, c','[^,]+', 1, LEVEL)) AS value
        FROM DUAL CONNECT BY trim(REGEXP_SUBSTR('a, b, c', '[^,]+', 1, LEVEL)) IS NOT NULL 
      ) 

并且有效。

我在Postgresql中做错了什么?

1 个答案:

答案 0 :(得分:0)

这是因为regexp_split_to_table返回一个表而不是每个rownumber的单个值。

也许一种不同的方法可行?例如,这给了我你想要的输出:

SELECT  regexp_split_to_table('a,b,c', ',')   as value, 
        rank() over(order by regexp_split_to_table('a,b,c', ','))   as rownumber
编辑:以上内容将重新排序可能不是您想要的结果。以下将保留顺序:

WITH T as
(
SELECT  regexp_split_to_table('d,a,b,c', ',')   as value
)

SELECT  row_number() over() as rownumber,
        value

FROM    t