gpt4 book ai didi

PostgreSQL-jsonb_each

转载 作者:行者123 更新时间:2023-11-29 11:13:42 28 4
gpt4 key购买 nike

我刚刚开始在 postgres 上玩弄 jsonb 并发现很难在网上找到示例,因为它是一个相对较新的概念。我正在尝试使用 jsonb_each_text 打印出键和值表,但在单个文件中获取 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"}",所以如果我运行以下查询,我会得到(我必须更改“for ')

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)"

最佳答案

这里的主要问题是您选择整行作为列(PostgreSQL 允许这样做)。您可以使用 SELECT (jsonb_each_text(data)).* ... 修复该问题。

但是:不要SELECT 设置返回函数,这通常会导致错误(或意外结果)。相反,使用 f.ex。 LATERAL加入/子查询:

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) .

关于PostgreSQL-jsonb_each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28857633/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com