PostgreSQL-jsonb_each
PostgreSQL - jsonb_each
我刚开始在 postgres 上玩 jsonb 并且很难在网上找到示例,因为它是一个相对较新的 concept.I 我正在尝试使用 jsonb_each_text 打印输出table 的键和值,但在单个列中获得 csv。
我将下面的 json 另存为 jsonb 并用它来测试我的查询。
{
"lookup_id": "730fca0c-2984-4d5c-8fab-2a9aa2144534",
"service_type": "XXX",
"metadata": "sampledata2",
"matrix": [
{
"payment_selection": "type",
"offer_currencies": [
{
"currency_code": "EUR",
"value": 1220.42
}
]
}
]
}
我可以使用
访问 offer_currencies 数组
SELECT element -> 'offer_currencies' -> 0
FROM test t, jsonb_array_elements(t.json -> 'matrix') AS element
WHERE element ->> 'payment_selection' = 'type'
给出的结果是“{"value": 1220.42, "currency_code": "EUR"}”,所以如果我 运行 下面的查询我得到(我有将 " 更改为 ')
select * from jsonb_each_text('{"value": 1220.42, "currency_code": "EUR"}')
Key | Value
---------------|----------
"value" | "1220.42"
"currency_code"| "EUR"
所以我使用上述理论创建了这个查询
SELECT jsonb_each_text(data)
FROM (SELECT element -> 'offer_currencies' -> 0 AS data
FROM test t, jsonb_array_elements(t.json -> 'matrix') AS element
WHERE element ->> 'payment_selection' = 'type') AS dummy;
但是这会在一列中打印 csv
record
---------------------
"(value,1220.42)"
"(currency_code,EUR)"
这里的主要问题是,您 select 整行作为一列(PostgreSQL 允许这样做)。您可以使用 SELECT (jsonb_each_text(data)).* ...
.
修复该问题
但是:不要SELECT
设置返回函数,这通常会导致错误(或意外结果)。相反,使用 f.ex。 LATERAL
joins/sub-queries:
select first_currency.*
from test t
, jsonb_array_elements(t.json -> 'matrix') element
, jsonb_each_text(element -> 'offer_currencies' -> 0) first_currency
where element ->> 'payment_selection' = 'type'
注意:FROM
子句中的函数调用是隐式的LATERAL
连接(此处:CROSS JOIN
s)。
WITH testa AS(
select jsonb_array_elements
(t.json -> 'matrix') -> 'offer_currencies' -> 0 as jsonbcolumn from test t)
SELECT d.key, d.value FROM testa
join jsonb_each_text(testa.jsonbcolumn) d ON true
ORDER BY 1, 2;
tetsa 获取时间 jsonb 数据。然后使用横向连接将jsonb数据转换为table格式。
我刚开始在 postgres 上玩 jsonb 并且很难在网上找到示例,因为它是一个相对较新的 concept.I 我正在尝试使用 jsonb_each_text 打印输出table 的键和值,但在单个列中获得 csv。
我将下面的 json 另存为 jsonb 并用它来测试我的查询。
{
"lookup_id": "730fca0c-2984-4d5c-8fab-2a9aa2144534",
"service_type": "XXX",
"metadata": "sampledata2",
"matrix": [
{
"payment_selection": "type",
"offer_currencies": [
{
"currency_code": "EUR",
"value": 1220.42
}
]
}
]
}
我可以使用
访问 offer_currencies 数组SELECT element -> 'offer_currencies' -> 0
FROM test t, jsonb_array_elements(t.json -> 'matrix') AS element
WHERE element ->> 'payment_selection' = 'type'
给出的结果是“{"value": 1220.42, "currency_code": "EUR"}”,所以如果我 运行 下面的查询我得到(我有将 " 更改为 ')
select * from jsonb_each_text('{"value": 1220.42, "currency_code": "EUR"}')
Key | Value
---------------|----------
"value" | "1220.42"
"currency_code"| "EUR"
所以我使用上述理论创建了这个查询
SELECT jsonb_each_text(data)
FROM (SELECT element -> 'offer_currencies' -> 0 AS data
FROM test t, jsonb_array_elements(t.json -> 'matrix') AS element
WHERE element ->> 'payment_selection' = 'type') AS dummy;
但是这会在一列中打印 csv
record
---------------------
"(value,1220.42)"
"(currency_code,EUR)"
这里的主要问题是,您 select 整行作为一列(PostgreSQL 允许这样做)。您可以使用 SELECT (jsonb_each_text(data)).* ...
.
但是:不要SELECT
设置返回函数,这通常会导致错误(或意外结果)。相反,使用 f.ex。 LATERAL
joins/sub-queries:
select first_currency.*
from test t
, jsonb_array_elements(t.json -> 'matrix') element
, jsonb_each_text(element -> 'offer_currencies' -> 0) first_currency
where element ->> 'payment_selection' = 'type'
注意:FROM
子句中的函数调用是隐式的LATERAL
连接(此处:CROSS JOIN
s)。
WITH testa AS(
select jsonb_array_elements
(t.json -> 'matrix') -> 'offer_currencies' -> 0 as jsonbcolumn from test t)
SELECT d.key, d.value FROM testa
join jsonb_each_text(testa.jsonbcolumn) d ON true
ORDER BY 1, 2;
tetsa 获取时间 jsonb 数据。然后使用横向连接将jsonb数据转换为table格式。