如何通过“完整”JSON字段查询?

时间:2014-12-22 14:43:22

标签: json postgresql types

我更新了以下几个字段:

UPDATE designs 
SET prices = '{ "at": 507, "ch": 751, "de": 447 }' 
WHERE prices IS NULL;

现在我想找到所有这些行:

SELECT * FROM designs 
WHERE prices = '{ "at": 507, "ch": 751, "de": 447 }';

但是我收到了这个错误:

ERROR:  operator does not exist: json = unknown

WHERE prices LIKE '%"at": 507, "ch": 751, "de": 447%'等变体既不起作用。

字段prices来自json类型,使用的PG版本为9.3

2 个答案:

答案 0 :(得分:3)

Postgres中有jsonb 9.4 ,它有一个相等运算符。此数据类型实际上忽略了无关紧要的空白区域(以及其他一些无关紧要的详细信息),因此您的查询将运行:

SELECT *
FROM   designs 
WHERE  prices = '{ "at": 507, "ch": 751, "de": 447 }';

json保留无关紧要的空白区域是不可能的,因此很难建立两个json值之间的“相等”。您可以比较文字表示,但不可靠

再次使用第9.4页,您还可以使用json列进行此操作,方法是将值转换为jsonb

SELECT *
FROM   designs 
WHERE  prices::jsonb = '{ "at": 507, "ch": 751, "de": 447 }'::jsonb;

答案 1 :(得分:1)

不幸的是,没有为=字段定义运算符JSON。如果确实想要这样做,那么您唯一的选择是投射为TEXT,但我确信您了解该方法的潜在问题,例如,

SELECT * FROM designs WHERE prices::TEXT = '{ "x": 3 }';

然而,我刚刚想到一个安全的方法是:

SELECT * FROM designs WHERE prices::TEXT = '{ "x": 3 }'::JSON::TEXT;

不,这不起作用。显然,JSON数据类型会保留原始JSON的空白,因此如果两个字符串中的空格不同,则无效。 (我认为这是一个错误,但其他人可能不同意。)

我的回答是正确的9.3,提问者正在使用,但如果你使用9.4+,Erwin Brandstetter的答案是更好的选择。