【问题标题】:Get rid of all empty strings values in jsonb | Postgres去掉 jsonb 中的所有空字符串值 | Postgres
【发布时间】:2021-03-11 17:35:03
【问题描述】:

我对@9​​87654321@ jsonb 数据有一个相当抽象的问题。

例如,我有一个名为…table_one 的表,其中有一个列:

my_jsonb_column   jsonb;

在 100% 的情况下包含扁平的json 结构,如

示例:

{"one": null, "two": 0, "three": "" } 

可能是不同的长度或null,但总是平坦的。

我的目标就是这样。

每当我选择此列时,我都需要以某种方式将空字符串值 “” 转换为 null 对于每个值为 “” 的 json 成员

示例:

{"one": null, "two": 0, "three": "" }  - > {"one": null, "two": 0, "three": null } 

最好没有 PLPGsql

Postgres 版本 - 11

谢谢。

【问题讨论】:

  • 可能过于简单,无法仅搜索 "" 并替换为 null? --> WITH j (val) AS ( VALUES ('{"one": null, "two": 0, "three": "" }'::jsonb)) SELECT replace(val::text,'""','null')::jsonb FROM j
  • 干净整洁,但不幸的是 "" 是一个有效的 JSON 密钥,而 null 不是:)
  • @Stefanov.sm 你说得对。我只是在考虑值,而不是键...感谢您的指出!
  • @JimJones 和 "this\"" 也会爆炸 :)

标签: sql json postgresql


【解决方案1】:

如果您想避免编写函数,请尝试搜索空字符串""并使用replace将其更改为null

WITH j (val) AS (
  VALUES ('{"one": null, "two": 0, "three": "" }'::jsonb)
) SELECT replace(val::text,'""','null')::jsonb FROM j;

                replace                 
----------------------------------------
 {"one": null, "two": 0, "three": null}

演示:db<>fiddle

如果您希望替换空字符串,即使您在 SELECT 中没有这样说,您可能需要在 INSERTUPDATE 上写一个 TRIGGER 以保持 jsonb 列的清洁未来的选择。根据您的用例,查看GENERATATED COLUMNS 可能也很有趣。

注意:正如@Stefanov.sm 所指出的,如果存在带有空字符串的键,则简单的替换将不起作用。

【讨论】:

  • 为了避免某些情况(空字符串键,像“this\””这样的值)最好使用regexp_replace(val::text, '[^\\]("")[^:]?', 'null')而不是replace(val::text,'""','null')。正则表达式可以进一步改进。
【解决方案2】:

作为一个plpgsql函数:

create function jsonb_es_to_null(arg_j jsonb) returns jsonb immutable strict as
$body$
 declare retval jsonb := '{}'::jsonb;
 r record;
 begin
    for r in select * from jsonb_each(arg_j) loop
        retval := retval || jsonb_build_object(r.key, case when r.value <> '""' then r.value end);
    end loop;
    return retval;
 end;
$body$ language plpgsql;

【讨论】:

    猜你喜欢
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多