如何从jsonb中删除所有值为null的元素?

3
我有一个名为"points"的表格和列"node_id"、"tags"等。
如何从jsonb元素"tags"中删除所有值为null的元素?
{
  "addInfo": {
    "payment": {
      "payment:dkv": null,
      "payment:uta": null,
    },
    "fueltype": {
      "fuel:diesel": "yes",
      "fuel:octane_91": null,
      "fuel:octane_95": "yes",
      "fuel:octane_98": null
    },
    "operating": {
      "name": "Raiffeisen",
      "brand": "Raiffeisen",
      "operator": null,
      "opening_hours": "24/7"
    }
  }
}

我想获取这个表单:
{
  "addInfo": {
    "payment": {},
    "fueltype": {
      "fuel:diesel": "yes",
      "fuel:octane_95": "yes"
    },
    "operating": {
      "name": "Raiffeisen",
      "brand": "Raiffeisen",
      "opening_hours": "24/7"
    }
  }
}

我尝试使用这个示例代码,它可以工作,但不够智能。我使用了两次jsonb_strip_nulls并进行了替换和文本与jsonb之间的转换。有没有其他更聪明的方法来获得相同的结果?
SELECT node_id,
       nullif(jsonb_strip_nulls(replace("addInfo" ::text, '{}', 'null')
                                ::jsonb) ::text,
              '{}') ::jsonb
  FROM (SELECT jsonb_strip_nulls(
                 jsonb_build_object('addInfo',
                                     jsonb_build_object('EXAMPLE....'))) "addInfo"
          FROM points p
         WHERE p.tags notnull
           AND p.tags - >> 'amenity' = 'fuel') foo;

如何恢复原始排序:

1 operating
2 payment
3 fueltype
1个回答

7

json_strip_nullsjsonb_strip_nulls函数可以删除给定JSON值中所有具有null值的对象字段。不是对象字段的空值将保持不变。这些函数最好的一面是它们是递归的,因此该函数还会删除子JSON对象中的null值。

注意!- 您的JSON字符串代码无效,我在您的JSON中删除了一个,字符并加了注释。

select jsonb_strip_nulls(
'{
    "addInfo": {
        "payment": {
            "payment:dkv": null,
            "payment:uta": null   /* in here I removed character: "," */
        },
        "fueltype": {
            "fuel:diesel": "yes",
            "fuel:octane_91": null,
            "fuel:octane_95": "yes",
            "fuel:octane_98": null
        },
        "operating": {
            "name": "Raiffeisen",
            "brand": "Raiffeisen",
            "operator": null,
            "opening_hours": "24/7"
        }
    }
}')

运行正常!!! 结果:

{
  "addInfo": {
    "payment": {},
    "fueltype": {
      "fuel:diesel": "yes",
      "fuel:octane_95": "yes"
    },
    "operating": {
      "name": "Raiffeisen",
      "brand": "Raiffeisen",
      "opening_hours": "24/7"
    }
  }
}

是否有可能同时删除所有空对象 {}? - Tibor
2
jsonb_strip_nulls - 这个函数仅删除 null 值,但我编写了一个示例递归函数来删除 null 和空对象。您可以从我的 GitHub 资料库中查看此示例:https://github.com/raminfaracov/PostgreSQL-json-examples/blob/main/remove_null_empty_objects_from_json.sql - Ramin Faracov
我需要一个模式示例吗?应该有一些数据吗? - Tibor
这是一个样例数据:https://github.com/raminfaracov/PostgreSQL-json-examples/blob/main/sample_data.sql,如果您想查看结果数据,可以参考result.json文件。 - Ramin Faracov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接