连接 json 个值的数组 PostgreSQL
Concatenate array of json values PostgreSQL
下面有一个table
Column
Type
id
integer
caseworker
uuid
data
jsonb
其中包含以下数据
id
caseworker
data
1
sally
{"CaseNumber": "001","claimant": "Barbara","Location": "Manchester","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxb0","value": "2022-01-24"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxf4","value": "2022-01-25"}]"defense":{"defendant": "Mariah","Location": "Manchester","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz0","value": "2022-01-24"},{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz1","value": "2022-01-25"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxz4","value": "2022-01-26"}]}}
2
jason
{"CaseNumber": "002","claimant": "Michael","Location": "London","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxb1","value": "2022-02-24"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxf5","value": "2022-02-25"}]"defense":{"defendant": "Killian","Location": "London","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz1","value": "2022-02-24"},{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz2","value": "2022-02-25"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxz5","value": "2022-02-26"}]}}
3
william
{"CaseNumber": "003","claimant": "Lisa","Location": "Birmingham","defense":{"defendant": "Larry","Location": "London","unavailableDates": {"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz2","value": "2022-02-24"},{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz3","value": "2022-02-25"},{"id": "f7f837787ab1-4b33-abe5-xxxxxxxxxxz6","value": "2022-02-26"}]}}
4
ricky
{"CaseNumber": "004","claimant": "Leon","Location": "Isle of Man","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz3","value": "2022-02-24"},{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz5","value": "2022-02-25"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxz7","value": "2022-02-26"}]"defense":{"defendant": "Cillian","Location": "Birmingham",}}
5
megan
{"CaseNumber": "005","claimant": "Gavin","Location": "Bristol","defense":{"defendant": "John","Location": "Isle of Man",}}
我对 PostgreSQL 查询和 JSON 还很陌生,希望获得如下所示的输出。是否可以在 单个查询 中完成(如果不行,可以使用 WITH AS () 创建 'temp' table 然后查询那个临时 table)?我一直在玩 STRING_AGG 和 jsonb_array_elements 但我无法得到低于我想要的输出.
caseworker
Case Number
Claimant
Clm_Loc
Clm_Unavail_Dates
Defendant
Def_Loc
Def_Unavail_Dates
sally
001
Barbara
Manchester
"2022-01-24", "2022-01-25"
Mariah
Manchester
"2022-01-24", "2022-01-25", "2022-01-26"
jason
002
Michael
London
"2022-02-24", "2022-02-25"
Killian
London
"2022-02-24", "2022-02-25", "2022-02-26"
william
003
Lisa
Birmingham
Larry
London
"2022-02-24", "2022-02-25", "2022-02-26"
ricky
004
Leon
Isle of Man
"2022-02-24", "2022-02-25", "2022-02-26"
Cillian
Birmingham
megan
005
Gavin
Bristol
John
Isle of Man
希望有人能帮忙:)。
如果您可以接受 JSON 日期数组,这很容易。
使用->>
将键值提取为字符串。可以使用 jsonb_path_query_array()
将日期提取为 JSON 数组
select caseworker,
data ->> 'CaseNumber' as casenumber,
data ->> 'claimant' as claimant,
data ->> 'Location' as clm_loc,
jsonb_path_query_array(data, '$.unavailableDates.value') as Clm_Unavail_Dates,
data -> 'defense' ->> 'defendant' as defendant,
data -> 'defense' ->> 'Location' as def_loc,
jsonb_path_query_array(data, '$.defense.unavailableDates.value') as Def_Unavail_Dates
from the_table
下面有一个table
Column | Type |
---|---|
id | integer |
caseworker | uuid |
data | jsonb |
其中包含以下数据
id | caseworker | data |
---|---|---|
1 | sally | {"CaseNumber": "001","claimant": "Barbara","Location": "Manchester","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxb0","value": "2022-01-24"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxf4","value": "2022-01-25"}]"defense":{"defendant": "Mariah","Location": "Manchester","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz0","value": "2022-01-24"},{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz1","value": "2022-01-25"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxz4","value": "2022-01-26"}]}} |
2 | jason | {"CaseNumber": "002","claimant": "Michael","Location": "London","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxb1","value": "2022-02-24"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxf5","value": "2022-02-25"}]"defense":{"defendant": "Killian","Location": "London","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz1","value": "2022-02-24"},{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz2","value": "2022-02-25"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxz5","value": "2022-02-26"}]}} |
3 | william | {"CaseNumber": "003","claimant": "Lisa","Location": "Birmingham","defense":{"defendant": "Larry","Location": "London","unavailableDates": {"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz2","value": "2022-02-24"},{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz3","value": "2022-02-25"},{"id": "f7f837787ab1-4b33-abe5-xxxxxxxxxxz6","value": "2022-02-26"}]}} |
4 | ricky | {"CaseNumber": "004","claimant": "Leon","Location": "Isle of Man","unavailableDates": [{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz3","value": "2022-02-24"},{"id": "0372d8d7-2778-4175-8826-xxxxxxxxxxz5","value": "2022-02-25"},{"id": "f7f83778-7ab1-4b33-abe5-xxxxxxxxxxz7","value": "2022-02-26"}]"defense":{"defendant": "Cillian","Location": "Birmingham",}} |
5 | megan | {"CaseNumber": "005","claimant": "Gavin","Location": "Bristol","defense":{"defendant": "John","Location": "Isle of Man",}} |
我对 PostgreSQL 查询和 JSON 还很陌生,希望获得如下所示的输出。是否可以在 单个查询 中完成(如果不行,可以使用 WITH AS () 创建 'temp' table 然后查询那个临时 table)?我一直在玩 STRING_AGG 和 jsonb_array_elements 但我无法得到低于我想要的输出.
caseworker | Case Number | Claimant | Clm_Loc | Clm_Unavail_Dates | Defendant | Def_Loc | Def_Unavail_Dates |
---|---|---|---|---|---|---|---|
sally | 001 | Barbara | Manchester | "2022-01-24", "2022-01-25" | Mariah | Manchester | "2022-01-24", "2022-01-25", "2022-01-26" |
jason | 002 | Michael | London | "2022-02-24", "2022-02-25" | Killian | London | "2022-02-24", "2022-02-25", "2022-02-26" |
william | 003 | Lisa | Birmingham | Larry | London | "2022-02-24", "2022-02-25", "2022-02-26" | |
ricky | 004 | Leon | Isle of Man | "2022-02-24", "2022-02-25", "2022-02-26" | Cillian | Birmingham | |
megan | 005 | Gavin | Bristol | John | Isle of Man |
希望有人能帮忙:)。
如果您可以接受 JSON 日期数组,这很容易。
使用->>
将键值提取为字符串。可以使用 jsonb_path_query_array()
select caseworker,
data ->> 'CaseNumber' as casenumber,
data ->> 'claimant' as claimant,
data ->> 'Location' as clm_loc,
jsonb_path_query_array(data, '$.unavailableDates.value') as Clm_Unavail_Dates,
data -> 'defense' ->> 'defendant' as defendant,
data -> 'defense' ->> 'Location' as def_loc,
jsonb_path_query_array(data, '$.defense.unavailableDates.value') as Def_Unavail_Dates
from the_table