如何分组/选择JSON类型列(PG::UndefinedFunction: ERROR: 无法识别json类型的平等运算符)[英] How to group/select JSON type column (PG::UndefinedFunction: ERROR: could not identify an equality operator for type json)

本文是小编为大家收集整理的关于如何分组/选择JSON类型列(PG::UndefinedFunction: ERROR: 无法识别json类型的平等运算符)的处理方法,想解了如何分组/选择JSON类型列(PG::UndefinedFunction: ERROR: 无法识别json类型的平等运算符)的问题怎么解决?如何分组/选择JSON类型列(PG::UndefinedFunction: ERROR: 无法识别json类型的平等运算符)问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想做

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

推荐答案

不幸的是,在 9.3 中没有简单的方法可以直接进行 json 相等测试.

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-tree opclass.两者在 SQL 级别都很简单 - 请参阅 CREATE OPERATOR 和 CREATE OPERATOR CLASS.

完成后,您将能够在 9.3 中 GROUP BY json 值.

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

本文地址:https://www.itbaoku.cn/post/1763960.html