我正在试验postgres jsonb
列类型,到目前为止一直很好。
我使用的一个常见问题是:
select count(*) from jsonbtest WHERE attributes @> '{"City":"Mesa"}';
如何扭转这种局面?是否有不同的运算符或仅用作
select count(*) from jsonbtest WHERE NOT attributes @> '{"City":"Mesa"}';
答案 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"}';