[英]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
中沒有這樣說,您可能需要在INSERT
或UPDATE
上編寫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.