【问题标题】:PostgreSQL - jsonb_eachPostgreSQL - jsonb_each
【发布时间】:2015-05-05 15:05:36
【问题描述】:

我刚刚开始在 postgres 上使用 jsonb 并在网上很难找到示例,因为它是一个相对较新的概念。我正在尝试使用 jsonb_each_text 打印出一个键和值表,但在一个单一的柱子。

我将以下 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)"

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:

    这里的主要问题是您选择整行作为列(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 JOINs)。

    【讨论】:

    • 你能推荐任何学习类似习语的资源吗(“不要选择集合返回函数,这通常会导致错误”)?
    【解决方案2】:
    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数据转换为表格格式。

    【讨论】:

      猜你喜欢
      • 2019-01-22
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2021-10-29
      • 2021-03-18
      • 2010-10-20
      • 2017-02-17
      • 2020-07-25
      相关资源
      最近更新 更多