Postgres - 选择没有表格但来自函数的数据的行号

Posted

技术标签:

【中文标题】Postgres - 选择没有表格但来自函数的数据的行号【英文标题】:Postgres - Select rownumber without a table but data from a function 【发布时间】:2016-04-29 23:20:01 【问题描述】:

我试图得到这样的结果:

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】:

发生这种情况是因为 regexp_split_to_table 返回一个表,而不是每个行号的单个值。

也许另一种方法会奏效?例如,这给了我你想要的输出:

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

【讨论】:

谢谢,这对我有用!刚刚添加了一个外部选择,因为我需要按表 t 中的行号进行过滤,例如 select value from ([your bottom query]) as table where rownumber = [my_number] 别担心,伙计。很高兴你们都排好了=)。

以上是关于Postgres - 选择没有表格但来自函数的数据的行号的主要内容,如果未能解决你的问题,请参考以下文章

尽管函数定义中有 RETURN 语句,但 Postgres 查询没有结果数据的目的地

有条件地选择不同的关系以反映用户的覆盖(Postgres)

从 Postgres 数据库中删除所有函数

使用来自 Nodejs Postgres 查询的数据 [重复]

R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?

Jqgrid 数据未显示在表格中,但数据来自控制台中的 URL,但现在显示在表格中