簡體   English   中英

Postgres:將元素數組轉換為多行

[英]Postgres: convert array of elements to multiple rows

使用查詢以及postgres中可用的函數(例如string_to_arraystring_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(),元素編號

SQL提琴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM