需要一些幫助來構建 PostgreSQL 查詢。我正在嘗試根據特定條件組合 Postgres 表中的各種行。
這是桌子的樣子
| Roll_No | 角色 | 地址型別 | 地址值 |
|---|---|---|---|
| 0538 | 家 | 地址第一行 | 大街 123 號 |
| 0538 | 家 | 地址行 2 | 倫敦 |
| 0538 | 家 | 地址行 3 | 羅杰斯街 |
| 0538 | 家 | 地址行 4 | 英國 |
| 0538 | 辦公室 | 地址第一行 | 亞當蘭德 |
| 0538 | 辦公室 | 地址行 2 | 福吉谷 PA 19482 |
| 0538 | 辦公室 | 地址行 3 | 美國 |
| 0738 | 學校 | 地址第一行 | 羅杰斯街 |
| 0738 | 學校 | 地址行 2 | 倫敦 |
| 0738 | 學校 | 地址行 3 | 荷蘭巷 |
| 0738 | 學校 | 地址行 4 | 英國 |
我想將特定角色(例如家庭、學校、辦公室)的所有地址值連接到一列中。地址型別可以包含諸如地址行 1 到 8 之類的值。這里,家庭具有地址行 1 到 4,而辦??公室具有地址行 1 到 3。
| Roll_No | 角色 | 地址型別 | 地址值 |
|---|---|---|---|
| 0538 | 家 | 家庭地址 | 123 Main Street, 倫敦, 羅杰斯街, 英國 |
| 0538 | 辦公室 | 辦公地址 | 亞當蘭德,福吉谷 PA 19482,美國 |
| 0738 | 學校 | 學校地址 | Rogers Street, London, Holland Lane, 英國 |
uj5u.com熱心網友回復:
使用array_agg()函式將列值與逗號組合。這里沒有使用 ORDER BY 子句,因為地址行 4 不會出現在地址行 1 之前。額外的 ORDER BY 子句會降低大型資料集的查詢性能
-- PostgreSQL
SELECT roll_no, role
, role || ' Address' address_type
, array_to_string(array_agg(address_value), ', ') address_value
FROM test
GROUP BY roll_no, role
ORDER BY roll_no, role;
請檢查此網址 https://dbfiddle.uk/?rdbms=postgres_11&fiddle=e46cf351452a2715258b69afeea5c742
如果在 array_agg() 函式中必須需要ORDER BY ,則使用以下查詢
-- after applying order by inside array_agg()
SELECT roll_no, role
, role || ' Address' address_type
, array_to_string(array_agg(address_value order by address_type), ', ') address_value
FROM test
GROUP BY roll_no, role
ORDER BY roll_no, role;
請檢查網址 https://dbfiddle.uk/?rdbms=postgres_11&fiddle=c196a9a2ca71bd886e4750b935d23040
如果為特定 roll_no 的特定角色的多個地址行存盤相同的地址,則DISTINCT關鍵字將在 array_agg() 中使用。
-- after applying distinct inside array_agg()
SELECT roll_no, role
, role || ' Address' address_type
, array_to_string(array_agg(DISTINCT address_value), ', ') address_value
FROM test
GROUP BY roll_no, role
ORDER BY roll_no, role;
請檢查此網址 https://dbfiddle.uk/?rdbms=postgres_11&fiddle=e4f0de7c37e003133e2539149db245f8
uj5u.com熱心網友回復:
你可以ARRAY_AGG()在里面使用,ARRAY_TO_STRING()但要小心。因為通常,SQL表格是unordered集合。因此明確地提到ORDER BY里面array_agg()是非常非常重要的。
代碼:
SELECT
Roll_No,
role,
role || ' address' AS address_type,
array_to_string(array_agg(addressvalue ORDER BY roll_no, role, addresstype), ', ') as address_value
FROM t
GROUP BY Roll_No, role
ORDER BY roll_no, role, address_value
看看db<>fiddle。看看有無ORDER BYinside的結果如何變化array_agg()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/415506.html
標籤:
