如何按“查询”;全称;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
值之间的“相等”。您可以比较文本表示,但这不可靠:
jsonb
来使用json
列:
SELECT *
FROM designs
WHERE prices::jsonb = '{ "at": 507, "ch": 751, "de": 447 }'::jsonb;
Postgres9.4中有一个等式运算符。此数据类型实际上忽略了不重要的空白(以及其他一些不重要的细节),因此您的查询将按原样工作:
对于保留不重要空白的json
,这是不可能的,因此很难建立两个json
值之间的“相等”。您可以比较文本表示,但这不可靠:
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_,没有名字,谢谢!我会调查的。