JION数据类型上的UNION ALL

时间:2013-09-16 20:10:56

标签: json postgresql compare union postgresql-9.2

我需要在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,它消除了重复的值)。

1 个答案:

答案 0 :(得分:9)

测试JSON值是否“相等”并非易事。除其他外,属性可以按任何顺序排序,二进制或文本表示可以完全不同,而仍然符合JSON规范的条件。这就是PostgreSQL中等于运算符未定义的原因。

如果您对文本表示相等感到满意(从示例中可以看出),您可以使用UNION ALLtext并稍后转换为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.