[英]How to split two columns array into rows in Postgresql
運行此查詢時:
SELECT id,col1,col2
FROM app_data.content_cards
我得到一張這樣的桌子:
+----+-------------------------------+--------+
| id | col1 | col2 |
+----+-------------------------------+--------+
| 90 | {'one', 'two', 'three'} | {1,2,3}|
+----+-------------------------------+--------+
| 91 | {'abc', 'def'} | {1,2} |
+----+-------------------------------+--------+
| 92 | {'asdf} | {1} |
+----+-------------------------------+--------+
我現在想要做的是獲取相同的信息,但將 arrays 分成幾行,所以我得到這樣的結果:
+----+---------------------+-------+
| id | col1 | col2 |
+----+---------------------+-------+
| 90 | one | 1 |
+----+---------------------+-------+
| 90 | two | 2 |
+----+---------------------+-------+
| 90 | three | 3 |
+----+---------------------+-------+
| 91 | abc | 1 |
+----+---------------------+-------+
| 91 | def | 2 |
+----+---------------------+-------+
| 92 | asdf | 1 |
+----+---------------------+-------+
如您所見,我不想在“col1”和“col2”中獲取值為 null 的行。
非常感謝!
假設 col1 和 col2 有相同數量的元素,你可以用 UNNEST function 做一個視圖來拆分它,然后查詢它。
WITH unnested_col1 AS (
SELECT id, unnest(col1) as col1, ROW_NUMBER() OVER (PARTITION BY id ORDER BY unnest(col1)) as row_num
FROM app_data.content_cards
), unnested_col2 AS (
SELECT id, unnest(col2) as col2, ROW_NUMBER() OVER (PARTITION BY id ORDER BY unnest(col2)) as row_num
FROM app_data.content_cards
)
SELECT unnested_col1.id, unnested_col1.col1, unnested_col2.col2
FROM unnested_col1
JOIN unnested_col2 ON unnested_col1.id = unnested_col2.id AND unnested_col1.row_num = unnested_col2.row_num
我們可以在兩列上使用UNNEST
:
SELECT id,
UNNEST(col1) AS col1,
UNNEST(col2) AS col2
FROM content_cards
ORDER BY id;
查看文檔
在這里試試: db<>fiddle
為確保匹配的數組條目在同一行結束,將兩個 arrays 傳遞給單個 unnest() 調用:
SELECT c.id, u.*
FROM content_cards c
cross join unnest(col1, col2) as u(col1, col2)
ORDER BY id;
這保證了來自匹配數組位置的元素在同一行中結束,即使一個數組具有不同數量的元素(缺失的元素將填充null
值)。
如果有可能某些 arrays 根本沒有元素,但您仍想查看基表的id
,請使用外部連接:
FROM content_cards c
left join unnest(col1, col2) as u(col1, col2) on true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.