我想做
.select("brief_content").group("brief_content")
这是表格方案,
:id => :integer, :content => :json, :brief_content => :json
但我得到了错误,
我该怎么办,谢谢
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...
Craig Ringer.. 9
不幸的是,没有简单的方法可以json
在9.3中进行直接相等测试.
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操作来执行相等比较.
为for定义一个等于运算符json
,然后使用该运算符定义一个简单的b-tree opclass.两者在SQL级别都很简单 - 请参阅CREATE OPERATOR
和CREATE OPERATOR CLASS
.
一旦你完成了,你将能够GROUP BY
在9.3中的json值.
或者您可以安装9.4 beta1并使用jsonb
.
不幸的是,没有简单的方法可以json
在9.3中进行直接相等测试.
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操作来执行相等比较.
为for定义一个等于运算符json
,然后使用该运算符定义一个简单的b-tree opclass.两者在SQL级别都很简单 - 请参阅CREATE OPERATOR
和CREATE OPERATOR CLASS
.
一旦你完成了,你将能够GROUP BY
在9.3中的json值.
或者您可以安装9.4 beta1并使用jsonb
.