Postgres JSON相当于HSTORE减法运算符

时间:2014-06-01 12:29:31

标签: json postgresql hstore postgresql-json jsonb

的Postgres' hstore扩展名有一个简洁的减法运算符:

hstore - text[]

hstore - hstore

在第一种情况下,它删除了在字符串数组中找到键的键/值对:在第二种情况下,它从第二个hstore中出现的第一个hstore中删除所有匹配的键/值对。 / p>

对于新的jsonb数据类型,似乎不存在此运算符。有没有简单的方法来执行这些任务?

2 个答案:

答案 0 :(得分:2)

关键是json_each()函数,以及PostgreSQL中手动构建json值的能力。

这是一个可以处理json - text[]的函数:

CREATE OR REPLACE FUNCTION "json_object_delete_keys"(
  "json" json,
  VARIADIC "keys_to_delete" TEXT[]
)
  RETURNS json
  LANGUAGE sql
  IMMUTABLE
  STRICT
AS $function$
SELECT COALESCE(
  (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')
     FROM json_each("json")
    WHERE "key" <> ALL ("keys_to_delete")),
  '{}'
)::json
$function$;

要处理json - json案例,您只需更改WHERE子句:

    WHERE "json"->>"key" <> ("remove"->>"key")),

答案 1 :(得分:1)

接受的答案很棒,但是通过检查null也可以改进json - json案例:

WHERE NOT null_as_value_cmp((this_j->>"key"), (that_j->>"key"))

如果没有NULL检查,您会获得{}而不是{"a":1}

# select json_subtract('{"a":1, "b":2}'::json, '{"b":2}'::json);
 json_subtract
---------------
 {}
(1 row)

null_as_value_cmp就是这样,并将JsNull表示为数据库NULL

CREATE OR REPLACE FUNCTION null_as_value_cmp(
    a text,
    b text
)
  RETURNS boolean
  LANGUAGE sql
  IMMUTABLE
  CALLED ON NULL INPUT
AS $function$
    SELECT CASE
        WHEN a IS NULL AND b IS NULL THEN
            TRUE
        WHEN (a IS NULL AND b IS NOT NULL) THEN
            FALSE
        WHEN (a IS NOT NULL AND b IS NULL) THEN
            FALSE
        WHEN a = b THEN
            TRUE
        ELSE
            FALSE
    END;
$function$;

[我没有足够的声誉发表评论;在这里不太确定SO协议。]