【问题标题】:Get an element in Json using PostgreSQL使用 PostgreSQL 在 Json 中获取一个元素
【发布时间】:2020-07-23 05:26:26
【问题描述】:

我有这个 JSON,我想得到这个部分:SQL 中的“1000000007296871”

{"pixel_rule":"{\"and\":[{\"event\":{\"eq\":\"Purchase\"}},{\"or\":[{\"content_ids\":{\"i_contains\":\"1000000007296871\"}}]}]}"}

如何做到这一点? 这是 JSON 转储

【问题讨论】:

  • 你的 JSON 数据看起来很奇怪。该列的数据类型究竟是什么?
  • 那是 JSON,我检查了 SELECT COLUMN_TYPE,并不是所有都像这样嵌套@a_horse_with_no_name
  • jsonjson[]?
  • 它显示json @a_horse_with_no_name
  • Json dump 让我更正一下@a_horse_with_no_name

标签: sql arrays json postgresql casting


【解决方案1】:

好吧,你可以这样做:

SELECT
(
    (
        (
            (
                (
                    '{"pixel_rule":"{\"and\":[{\"event\":{\"eq\":\"Purchase\"}},{\"or\":[{\"content_ids\":{\"i_contains\":\"1000000007296871\"}}]}]}"}'::json->>'pixel_rule'
                )::json->>'and'
            )::json->1
        )::json->>'or'
    )::json->0->>'content_ids'
)::json->>'i_contains';

但是您的输入确实很有趣,因为它包含多次嵌套在 json 中的 json。

【讨论】:

    【解决方案2】:

    一种选择是通过修剪 pixel_rule 值的包装引号来平滑对象,然后去掉多余的反斜杠,并连续应用 json_array_elements 函数以便将 #>> 运算符与相关提取所需值的路径:

    SELECT json_array_elements
           (
            json_array_elements(
               replace(trim((jsdata #>'{pixel_rule}')::text,'"'),'\','')::json -> 'and'
            ) -> 'or'
           )::json #>> '{content_ids,i_contains}' AS "Value"
      FROM tab
    

    Demo

    【讨论】:

      【解决方案3】:

      我的选择是使用regex '\d+' 如果其他部分不是数字

      select substring('string' from '\d+')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-25
        相关资源
        最近更新 更多