不幸的是没有简单的方法可以直接进行json
9.3 中的平等测试。
9.3's json
type 没有相等运算符,因为它接受具有重复键的 json(正如许多实现所期望的那样)。目前尚不清楚是否{"a":1, "a":2}
“等于”{"a":1}
or not.
9.4 增加jsonb
它会在最后一个键获胜的基础上折叠重复的键,从而使相等性变得明确。
regress=# SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
ERROR: operator does not exist: json = json
LINE 1: SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
regress=# SELECT '{"a":1, "a":2}'::jsonb = '{"a":1}'::jsonb;
?column?
----------
f
(1 row)
不幸的是,这意味着你不能简单地在 9.3 中做你想做的事。
您可以编写一个自定义相等运算符json
- 也许只是将两者都转换为文本并以这种方式进行比较,但这会对待{"a":1, "b":2}
and {"b":2, "a":1}
作为不平等。
更好的选择是安装 PL/V8 并使用 V8 JavaScript 引擎的 json 操作来执行相等比较。
定义一个相等运算符json
,然后使用该运算符定义一个简单的 b 树操作类。两者在 SQL 级别都很简单 - 请参阅CREATE OPERATOR
and CREATE OPERATOR CLASS
.
完成后,您将能够GROUP BY
9.3 中的 json 值。
或者你可以安装 9.4 beta1 并使用jsonb
.