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

 mobiledu2502876847 发布于 2023-01-07 20:50

我想做

.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 OPERATORCREATE OPERATOR CLASS.

一旦你完成了,你将能够GROUP BY在9.3中的json值.

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

1 个回答
  • 不幸的是,没有简单的方法可以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 OPERATORCREATE OPERATOR CLASS.

    一旦你完成了,你将能够GROUP BY在9.3中的json值.

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

    2023-01-07 20:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有