我更新了以下几个字段:
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
答案 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的答案是更好的选择。