如何对 JSON 类型列进行分组/选择(PG::UndefinedFunction: 错误: 无法识别 json 类型的等式运算符)

2024-05-20

我想做

<MODEL>.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...

不幸的是没有简单的方法可以直接进行json9.3 中的平等测试。

9.3's jsontype 没有相等运算符,因为它接受具有重复键的 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 BY9.3 中的 json 值。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对 JSON 类型列进行分组/选择(PG::UndefinedFunction: 错误: 无法识别 json 类型的等式运算符) 的相关文章

随机推荐