Postgres jsonb' NOT contains'操作者

时间:2016-09-28 00:03:42

标签: postgresql postgresql-9.4 jsonb

我正在试验postgres jsonb列类型,到目前为止一直很好。 我使用的一个常见问题是:

select count(*) from jsonbtest WHERE attributes @> '{"City":"Mesa"}';

如何扭转这种局面?是否有不同的运算符或仅用作

select count(*) from jsonbtest WHERE NOT attributes @> '{"City":"Mesa"}';

3 个答案:

答案 0 :(得分:5)

两种方式,您可以测试任何json(b)值

  • ->>运算符将值提取为文本。但是,如果您仅使用值test,则此操作会很慢
  • @>运算符测试任何json(b)包含任何json(b)。这是一种快速的方法,但是您没有经过NOT选项的测试。

简单快捷的方法:

NOT (attribute @> '{"City":"Mesa"}'::jsonb)

我将attribute->>'City' <> 'Mesa'更改为NOT (attribute @> '{"City":"Mesa"}'::jsonb),我的〜2.000.000行查询结果时间从45秒更改为25秒。

答案 1 :(得分:3)

这可以通过几种条件来实现。 它不优雅,但我没有找到另一种方法。

所以,首先,让每一行都没有'City'属性,然后添加'OR'条件来检查正确的字段值。

select count(*) from jsonbtest where 
  NOT(attributes ? 'City') 
  OR (attributes ? 'City') is NULL -- this is required if attributes can be null
  OR (attributes->>'City' != 'Mesa')) 

答案 2 :(得分:-1)

您可以使用运算符<@这将搜索“城市”不是“梅萨”的位置

select count(*) from jsonbtest WHERE attributes <@ '{"City":"Mesa"}';