:integer, -6ren">
gpt4 book ai didi

postgresql - 如何分组/选择 JSON 类型列(PG::UndefinedFunction: ERROR: could not identify an equality operator for type json)

转载 作者:行者123 更新时间:2023-11-29 11:31:06 26 4
gpt4 key购买 nike

我想做

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

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

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

关于postgresql - 如何分组/选择 JSON 类型列(PG::UndefinedFunction: ERROR: could not identify an equality operator for type json),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24377152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com