[英]Postgres: convert array of elements to multiple rows
使用查詢以及postgres中可用的函數(例如string_to_array
和string_agg
,可將原始表中的數據轉換為以下結果集。
id, text
001, {foo,boo,foo}
002, {"",for,test,friday}
003, {"","",test,friday,tuesday,foo,boo}
這里的id是一個人的id,文本實際上是數組的類型。 現在我想做的是生成以下結構。
id, text, text_count
001, foo, 2
001, boo, 1
002, test, 1
002, friday, 1
這是我用來獲取我已經提到的現有格式的查詢,但是如何增強該查詢以獲取id,text,text_count結果。
select id, string_to_array(string_agg(b.text,' '), ' ') as words
from tableA a,tableB b group by id
我也想用“”擺脫數據,我相信它們在postgres中是空字符串,但不是很確定。
使用unnest()
。
假設id
是唯一的:
SELECT id, txt, count(*) As txt_count
FROM (
SELECT id
, unnest(txt) AS txt
FROM tbl
) sub
WHERE txt <> ''
GROUP BY id, txt
ORDER BY id, txt;
txt
而不是text
,因為我從不使用基本類型名稱作為標識符。
條件WHERE txt <> ''
刪除了空字符串( ''
)和NULL
值。
取消嵌套數組時,結果集中的行數與數組中的元素數一樣多。 小心,當並行取消嵌套多個數組時:
PostgreSQL中是否有類似zip()函數的東西,它結合了兩個數組?
PostgreSQL中的並行unnest()和排序順序
在Postgres 9.3+中,使用LATERAL JOIN
有一個更簡潔的語法變體:
SELECT id, txt, count(*) As txt_count
FROM (
SELECT id, x.txt
FROM tbl t, unnest(t.txt) x(txt)
) sub
WHERE txt <> ''
GROUP BY id, txt
ORDER BY id, txt;
詳細信息在這里:
PostgreSQL unnest(),元素編號
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.