Postgresql 和 jsonb : WHERE <a specific nested field in my json> IS NOT NULL

标签 postgresql sql-update jsonb

public.challenge,列 JSONB

我的初始 JSON lines :

[
  {
    "line": 1,
    "blocs": [
      {
        "size": 100,
        "name": "abc"
      },
      {
        "size": 100,
        "name": "def"
      },
      {
        "size": 100,
        "name": "ghi"
      }
    ]
  },
  {
    "line": 2,
    "blocs": [
      {
        "size": 100,
        "name": "xyz"
      }
    ]
  }
]

期望的结果(为每个bloc添加一个新对象wrapper):

[
  {
    "line": 1,
    "blocs": [
      {
        "size": 100,
        "name": "abc",
        "wrapper": {
          "nestedName": "abc",
          "type": "regular"
        }
      },
      {
        "size": 100,
        "name": "def",
        "wrapper": {
          "nestedName": "def",
          "type": "regular"
        }
      },
      {
        "size": 100,
        "name": "ghi",
        "wrapper": {
          "nestedName": "ghi",
          "type": "regular"
        }
      }
    ]
  },
  {
    "line": 2,
    "blocs": [
      {
        "size": 100,
        "name": "xyz",
        "wrapper": {
          "nestedName": "xyz",
          "type": "regular"
        }
      }
    ]
  }
]

我有以下查询(来自 here ):

WITH cte AS (
   SELECT id_lines,
          jsonb_agg(
                  jsonb_set(val1, '{blocs}',
                      (
                        SELECT jsonb_agg(arr2 ||
                                         json_build_object(
                                             'wrapper', json_build_object('nestedName', arr2->'name', 'type', 'regular')
                                             )::jsonb
                            )
                        FROM jsonb_array_elements(arr1.val1->'blocs') arr2
                        WHERE arr2->'name' IS NOT NULL
                          )
                      ))
   FROM public.challenge, jsonb_array_elements(lines) arr1(val1)
   GROUP BY 1
)
UPDATE public.challenge SET lines=(cte.jsonb_agg) FROM cte
WHERE public.challenge.id_lines=cte.id_lines;

条件WHERE arr2->'name' IS NOT NULL不会过滤掉name为null的 block ,我很难找出原因..谢谢!

最佳答案

您必须区分 SQL NULL 和 JSON null

IS NOT NULL 谓词测试 SQL NULL,这意味着该属性不存在于 JSON 中。

要测试 JSON null,请使用

WHERE arr2->'name' <> 'null'::jsonb

类型转换为 jsonb 是不必要的,并且会隐式执行。

关于Postgresql 和 jsonb : WHERE <a specific nested field in my json> IS NOT NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68015588/

相关文章:

string - 在 PostgreSQL 中获取 JSONB 的紧凑版本

postgresql - 无法远程连接到 Postgres Docker 容器

postgresql - 选择并使用一列

postgresql - pgAdmin:作业选项不可见

sql - 在 Oracle DBMS 中使用单个 SQL 查询更新多行

sql-server - 如何在从自身更新同一个表时为表添加别名?

node.js - 使用 nodejs sequelize 的 Multi-Tenancy (SAAS)

mysql - 将数据从另一列插入到空(null)列 where 条件

python - SQLAlchemy,JSONB字段没有删除状态的历史记录

sql - 如何查询 PostgreSQL 9.5 JSONB 列中是否存在某个键?