Conditions and operators
Basic examples
Condition | SQL |
---|---|
{id: 2} | "id" = 2 |
{'id <': 2} | "id" < 2 |
{'id >': 2} | "id" > 2 |
{'id <=': 2} | "id" <= 2 |
{'id >=': 2} | "id" >= 2 |
{'id !=': 2} | "id" != 2 |
{'id <>': 2} | "id" != 2 |
{'id': null} | "id" is null |
{'id !=': null} | "id" is not null |
{'id is not': null} | "id" is not null |
{'id in':[1,2,3]} | "id" in (1,2,3) |
{'id not in':[1,2,3]} | "id" not in (1,2,3) |
Extended
Condition | SQL |
---|---|
{id: [1,2,3]} | "id" in (1,2,3) |
{'id <>': [1,2,3]} | "id" not in (1,2,3) |
{'id =*':'gamma'} | LOWER("id") = LOWER('gamma') |
{'fruits =*':'KiWi'} | LOWER("fruits") && '{kiwi}' //Has to have the LOWER function defined see below. (It uses GIN index if defined on fruits) |
Pattern matching
Condition | SQL |
---|---|
{'id ~~': 'a%'} | "id" LIKE 'a%' |
{'id !~~': 'a%'} | "id" NOT LIKE 'a%' |
{'id like': 'a%'} | "id" LIKE 'a%' |
{'id not like': 'a%'} | "id" NOT LIKE 'a%' |
{'id ~~*': 'a%'} | "id" ILIKE 'a%' |
{'id !~~*': 'a%'} | "id" NOT ILIKE 'a%' |
{'id ilike': 'a%'} | "id" ILIKE 'a%' |
{'id not ilike': 'a%'} | "id" NOT ILIKE 'a%' |
{'id similar to': 'a%'} | "id" SIMILAR TO 'a%' |
{'id not similar to': 'a%'} | "id" NOT SIMILAR TO 'a%' |
{'id ~': '^a'} | "id" ~ '^a' |
{'id !~': '^a'} | "id" !~ '^a' |
{'id ~*': '^a'} | "id" ~* '^a' |
{'id !~*': '^a'} | "id" !~* '^a' |
{'id is distinct from': '^a'} | "id" IS DISTINCT FROM '^a' |
{'id is not distinct from': '^a'} | "id" IS NOT DISTINCT FROM '^a' |
Extended
Condition | SQL |
---|---|
{'id ~~': ['1%','2%','3%']} | "id" LIKE ANY('{1%,2%,3%}') |
{'id !~~': ['1%','2%','3%']} | "id" NOT LIKE ALL('{1%,2%,3%}') |
{'id ~': ['^1','^2','^3']} | "id" LIKE ANY('{^1,^2,^3}') |
{'id !~': ['^1','^2','^3']} | "id" NOT LIKE ALL('{^1,^2,^3}') |
Array type
Condition | SQL | note |
---|---|---|
{'ids @>':[1,2,3]} | "ids" @> '{1,2,3}' | ids contains all of 1,2,3 |
{'ids <@':[1,2,3]} | "ids" <@ '{1,2,3}' | ids is a subset of {1,2,3} |
{'ids &&':[1,2,3]} | "ids" && '{1,2,3}' | ids overlaps with {1,2,3} |
{'ids': [1,2,3]} | "ids" = '{1,2,3}' | |
{'ids': 'a'} | 'a' = ANY("ids") | |
{'ids <>': 'a'} | 'a' <> ANY("ids") |
Please note that as-of-9.5 'a' = ANY("ids")
is not using the index in psql. So if have a GIN
index is defined on the column "ids",
You should use {'ids &&': ['a']}
(that is translated to "ids" && '{a}'
).
Extended
Condition | SQL |
---|---|
{'ids ~': 'a%'} | EXISTS (SELECT * FROM (SELECT UNNEST("ids") _el) _arr WHERE _arr._el ~ 'a%')'; //same with all pattern matching operator |
{'names &&*': ['A','B','C']} | LOWER("names") && '{a, b, c}' //case insensitive overlap operator, has to have the LOWER function defined for arrays (see below) |
Jsonb type
Condition | SQL | NOTE |
---|---|---|
{'jdata @>':[1,2,3]} | "jdata" @> '[1,2,3]' | |
{'jdata @>':{a:1}} | "jdata" @> '{a:1}' | |
{'jdata <@':[1,2,3]} | "jdata" <@ '[1,2,3]' | |
{'jdata <@':{a:1}} | "jdata" <@ '{a:1}' | |
{'jdata ?':'a'} | "jdata" ? 'a' | |
{'jdata ?|':['a','b']} | "jdata" ?| '{a,b}' | |
{'jdata ?&':['a','b']} | "jdata" ?& '{a,b}' | |
{'jdata -> a':{a:3}} | "jdata" -> 'a' = '{"a":3}'::jsonb | |
{'jdata -> 3':{a:3}} | "jdata" -> 3 = '{"a":3}'::jsonb | if the field is a number, the quote wont apply as it could refer index also |
{"jdata -> '3'":{a:3}} | "jdata" -> '3' = '{"a":3}'::jsonb | ... so you have to apply that manually |
{'jdata ->> a':3} | "jdata" ->>'a' = 3 | |
{'jdata ->> 3':3} | "jdata" ->> 3 = 3 | if the field is a number, the quote wont apply as it could refer index also |
{'jdata ->> '3'":'{"a": 3}'} | "jdata"->>3 = '{"a": 3}' | ... so you have to apply that manually |
{"jdata #> '{a,3}'":{a:3}} | "jdata"#>'{a,3}' = '{"a":3}'::jsonb | surronding {} with ' is possible but not obligatory |
{"jdata #>> {a,3}":'{"a": 3}'} | "jdata"#>>'{a,3}' = '{"a": 3}' | |
{"jdata #>> {a} >":'a' | "jdata"#>>'{a}' > 'a' |
Note:
->
,#>
returns as a JsonObject
->>
, #>>
returns as a string.
At the moment they are not converted automatically thou, for ->>
you should use JSON.stringify if needed.
(this is a later todo, you can help us! :), same goes for ->
, it not converted automaticaly if not an object passed in, but a number or string)
AND - OR
condition-expressions can be joined together e.g.:
Condition | SQL |
---|---|
{id:1, name:'a'} | id=1 AND name='a' |
{or: [{id:1}, {name:'a'}]} | id=1 OR name='a' |
{and: [ or: [{id:1}, {'port >':'1024'}], or: [{host:'localhost', os:'linux'}, {host:'127.0.0.1'}] ]} |
(.. OR ..) AND ((.. AND ..) OR ..) |
Definition of LOWER function for array type
CREATE OR REPLACE FUNCTION LOWER(text[]) RETURNS text[] LANGUAGE SQL IMMUTABLE AS $$ SELECT array_agg(LOWER(value)) FROM unnest($1) value; $$;