我需要在Postgres 9.2中使用JSON数据类型执行UNION ALL,但在执行此操作时,Postgres会回复此错误:
ERROR: could not identify an equality operator for type json SQL state: 42883 Character: 9
查询:
(select cast('{"billingcode" : "' || billingcode || '"}' as JSON)
from billing_2012_08 limit 10)
union
(select cast('{"charged" : "' || charged || '"}' as JSON)
from sending_response_2012_08 limit 10)
这里有什么问题?
正如我所发现的,似乎Postgres没有为json数据类型定义一个相等的运算符。如果这是正确的,为什么?
作为试图找出问题的一个例子,这很好用:
(select cast('{"billingcode" : "' || billingcode || '"}' as JSON)
from billing_2012_08 limit 10)
union all
(select cast('{"charged" : "' || charged || '"}' as JSON)
from sending_response_2012_08 limit 10)
注意,UNION ALL
只是“添加”结果(而不仅仅是UNION
,它消除了重复的值)。
答案 0 :(得分:9)
测试JSON值是否“相等”并非易事。除其他外,属性可以按任何顺序排序,二进制或文本表示可以完全不同,而值仍然符合JSON规范的条件。这就是PostgreSQL中等于运算符未定义的原因。
如果您对文本表示相等感到满意(从示例中可以看出),您可以使用UNION ALL
列text
并稍后转换为json
:
SELECT json_col::json
FROM (
(SELECT '{"billingcode" : "' || billingcode || '"}'::text AS json_col
FROM billing_2012_08 LIMIT 10)
UNION ALL
(SELECT '{"charged" : "' || charged || '"}'::text
FROM sending_response_2012_08 LIMIT 10)
) sub
<强> -> SQLfiddle demo. 强>