如何按“查询”;全称;JSON字段?

如何按“查询”;全称;JSON字段?,json,postgresql,types,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 = unkno

我更新了以下几个字段:

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
这样的变体,价格像“%”at:507,“ch:751,“de:447%”
也不起作用


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

,不幸的是,没有为
json
字段定义运算符
=
。如果您真的想这样做,您唯一的选择是将其转换为
文本
,但我相信您了解该方法的潜在问题,例如

SELECT * FROM designs WHERE prices::TEXT = '{ "x": 3 }';
然而,我突然想到,一个安全的方法是:

不,这不行。显然,
JSON
数据类型保留了原始
JSON
的空白,因此如果两个字符串中的空白不同,它将无法工作。(我认为这是一个bug,但其他人可能不同意。)


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

不幸的是,没有为
JSON
字段定义运算符
=
。如果您真的想这样做,您唯一的选择是将其转换为
文本
,但我相信您了解该方法的潜在问题,例如

SELECT * FROM designs WHERE prices::TEXT = '{ "x": 3 }';
然而,我突然想到,一个安全的方法是:

不,这不行。显然,
JSON
数据类型保留了原始
JSON
的空白,因此如果两个字符串中的空白不同,它将无法工作。(我认为这是一个bug,但其他人可能不同意。)

我的答案对于提问者正在使用的9.3是正确的,但是如果你使用的是9.4+,欧文·布兰斯特特的答案是更好的选择。在Postgres9.4中有一个等式操作符。此数据类型实际上忽略了不重要的空白(以及其他一些不重要的细节),因此您的查询将按原样工作:

对于保留不重要空白的
json
,这是不可能的,因此很难建立两个
json
值之间的“相等”。您可以比较文本表示,但这不可靠:

再次使用第9.4页,您还可以通过动态地将值转换为
jsonb
来使用
json
列:

SELECT *
FROM   designs 
WHERE  prices::jsonb = '{ "at": 507, "ch": 751, "de": 447 }'::jsonb;
Postgres9.4中有一个等式运算符。此数据类型实际上忽略了不重要的空白(以及其他一些不重要的细节),因此您的查询将按原样工作:

对于保留不重要空白的
json
,这是不可能的,因此很难建立两个
json
值之间的“相等”。您可以比较文本表示,但这不可靠:

再次使用第9.4页,您还可以通过动态地将值转换为
jsonb
来使用
json
列:

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

这不是一个bug,它是
json
类型的一个特性(即使对大多数人来说不是特别有用)。正确的解决方案是第9.4.Hm页中的
jsonb
。我们是否可以转换到<代码> JSONB以获得字段排序,然后将其转换成文本以使其具有可比性?@ IgorRomanchenko:是的,考虑我的答案中的第二个查询(不需要实际涉及<代码>文本< /代码>)。它不是一个bug,它是<代码> JSON < /C>类型的特征(即使对大多数都不是特别有用)。正确的解决方案是第9.4.Hm页中的
jsonb
。我们是否可以转换到<代码> JSONB以获得字段排序,然后将其转换成文本以使其具有可比性?@ IgorRomanchenko:是的,考虑我的答案中的第二个查询(不需要实际涉及<代码>文本< /代码>)。这很好知道!我可能应该将我的几个
JSON
字段转换为
JSONB
。如果提问者使用9.4,这将是正确的答案。知道这一点很好!我可能应该将我的几个
JSON
字段转换为
JSONB
。如果提问者使用9.4,这将是正确的答案。考虑到JSON文档的内容,
hstore
数据类型可能是更好的选择。@a_horse_,没有名字,谢谢!我们来看看。考虑到JSON文档的内容,
hstore
数据类型可能是更好的选择。@a_horse_,没有名字,谢谢!我会调查的。