назначить уникальный номер каждой строке, возвращаемой regexp_split_to_table в Postgres - PullRequest
0 голосов
/ 21 февраля 2020

Мне нужен вывод ниже для вывода regexp_split_to_table: -

select  regexp_split_to_table ('a,b,c,d,e,f',',') expr
---------------------------------------------

rownum    expr
--------------
1          a
2          b
3          c
4          d
5          e
6          f

Я также пытался использовать функцию row_number (), но она возвращает 1 для всех строк

select row_number() over (), regexp_split_to_table ('a,b,c,d,e,f',',') 
rownum    expr
--------------
1          a
1          b
1          c
1          d
1          e
1          f

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Вот для чего with ordinality:

select rownum, expr
from regexp_split_to_table ('a,b,c,d,e,f',',') with ordinality as t(expr, rownum)

rownum ("ординальность") - это "индекс" этого элемента в результате regexp_split_to_table


Обратите внимание, что использование string_to_array() с unnest обычно быстрее, поскольку регулярные выражения довольно дороги:

select rownum, expr
from unnest(string_to_array('a,b,c,d,e,f',',')) with ordinality as t(expr, rownum)
0 голосов
/ 21 февраля 2020

Попробуйте обернуть текущий запрос в CTE и затем использовать ROW_NUMBER:

WITH cte AS (
    SELECT REGEXP_SPLIT_TO_TABLE ('a,b,c,d,e,f', ',') expr
)

SELECT
    ROW_NUMBER() OVER (ORDER BY expr) rownum,
    expr
FROM cte
ORDER BY expr;
...