Search code examples
postgresqlpostgresql-9.4jsonb

Postgres jsonb 'NOT contains' operator


I'm experimenting with postgres jsonb column types, and so far so good. One common query I'm using is like this:

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

How do I reverse that? Is there a different operator or is it simply used as

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

Solution

  • Two way, you can test any json(b) value

    • the ->> operator extract value as text. But this operation slow, if you will use the value only test
    • the @> operator test any json(b) contain any json(b). This is a quick but you are not tested NOT option.

    Simply and quick way:

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

    I've change attribute->>'City' <> 'Mesa' to NOT (attribute @> '{"City":"Mesa"}'::jsonb) and my ~2.000.000 rows query result time changed 45secs to 25secs.