Postgresql 如何分组/选择JSON类型列(PG::UndefinedFunction:错误:无法识别JSON类型的相等运算符)

Postgresql 如何分组/选择JSON类型列(PG::UndefinedFunction:错误:无法识别JSON类型的相等运算符),postgresql,ruby-on-rails-4,rails-activerecord,Postgresql,Ruby On Rails 4,Rails Activerecord,我想做 <MODEL>.select("brief_content").group("brief_content") 但是我犯了错误 我该怎么办,谢谢 companyAlarmLog Load (0.9ms) SELECT company_alarm_logs.id, company_alarm_logs.name, company_alarm_logs.utc_time, company_alarm_logs.company_alarm_test_id, company_ala

我想做

<MODEL>.select("brief_content").group("brief_content")
但是我犯了错误

我该怎么办,谢谢

companyAlarmLog Load (0.9ms)  SELECT company_alarm_logs.id, company_alarm_logs.name, company_alarm_logs.utc_time, company_alarm_logs.company_alarm_test_id, company_alarm_logs.brief_content, brief_content FROM "company_alarm_logs" GROUP BY brief_content ORDER BY utc_time
E, [2014-06-24T09:40:39.069988 #954] ERROR -- : PG::UndefinedFunction: ERROR:  could not identify an equality operator for type json
LINE 1: ...t, brief_content FROM "company_alarm_logs"  GROUP BY brief_cont...
                                                             ^
: SELECT company_alarm_logs.id, company_alarm_logs.name, company_alarm_logs.utc_time, company_alarm_logs.company_alarm_test_id, company_alarm_logs.brief_content, brief_content FROM "company_alarm_logs"  GROUP BY brief_content  ORDER BY utc_time
Hirb Error: PG::UndefinedFunction: ERROR:  could not identify an equality operator for type json
LINE 1: ...t, brief_content FROM "company_alarm_logs"  GROUP BY brief_cont...

不幸的是,在9.3中没有简单的方法进行直接的
json
equality测试

9.3的
json
类型没有相等运算符,因为它接受带有重复键的json(正如许多实现所期望的那样)。不清楚
{“a”:1,“a”:2}
是否等于
{“a”:1}

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}
{“b”:2,“a”:1}
视为不相等

更好的选择是安装PL/V8并使用V8 JavaScript引擎的json操作来执行相等比较

json
定义一个相等运算符,然后使用该运算符定义一个简单的b树opclass。这两种操作在SQL级别都很简单—请参见
CREATE OPERATOR
CREATE OPERATOR CLASS

完成后,您将能够按照9.3中的json值进行分组

或者您可以安装9.4 beta1并使用
jsonb

.group('brief\u content:text')
就可以了。无论如何,当字段在序列化json中的顺序不同时,它可能不准确。在rails中,这应该不是问题

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)