簡體   English   中英

如何將兩列數組拆分為 Postgresql 中的行

[英]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.

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