簡體   English   中英

去掉 jsonb 中的所有空字符串值 | Postgres

[英]Get rid of all empty strings values in jsonb | Postgres

我對PostgreSQL jsonb數據有相當抽象的問題。

例如,我有一個名為... table_one的表,其中有一列:

my_jsonb_column   jsonb;

在 100% 的情況下包含扁平的json結構,如

例子:

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

可能是不同的長度或null但總是平坦的。

我的目標就是這樣。

每當我 select 此列時,我需要以某種方式將空字符串值“”轉換為null的每個成員的 null,其中它的值為“”

例子:

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

最好沒有 PLPGsQL

Postgres 版本 - 11

謝謝你。

如果你想避免寫一個 function,嘗試搜索空字符串""並使用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 所指出的,如果存在帶有空字符串的鍵,則簡單的替換將不起作用。

作為plpgsql function:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM