Where
The SQL where
clause filters the results of a query by one or multiple columns. The same is achieved in this library by adding a where
field to any query definition. E.g:
import { selectMany } from 'unconventional-pg-queries';
const response = await selectMany(client, {
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Lt, value: 30 }
]
});
import { selectMany } from 'unconventional-pg-queries';
const response = await selectMany(client, {
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Lt, value: 30 }
]
});
Generated SQL
SELECT * FROM public.users fromref
WHERE (fromref."age")::int < 30
SELECT * FROM public.users fromref
WHERE (fromref."age")::int < 30
Operators
The following operators are supported by the where
field:
Equal
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.Eq, value: 'John' }
]
}
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.Eq, value: 'John' }
]
}
SELECT * FROM public.users fromref
WHERE fromref."firstName" = 'John'
SELECT * FROM public.users fromref
WHERE fromref."firstName" = 'John'
Not Equal
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.Neq, value: 'John' }
]
}
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.Neq, value: 'John' }
]
}
SELECT * FROM public.users fromref
WHERE fromref."firstName" <> 'John'
SELECT * FROM public.users fromref
WHERE fromref."firstName" <> 'John'
Greater Than
{
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Gt, value: 30 }
]
}
{
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Gt, value: 30 }
]
}
SELECT * FROM public.users fromref
WHERE (fromref."age")::int > 30
SELECT * FROM public.users fromref
WHERE (fromref."age")::int > 30
Greater Than Or Equal
{
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Gt, value: 30 }
]
}
{
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Gt, value: 30 }
]
}
SELECT * FROM public.users fromref
WHERE (fromref."age")::int >= 30
SELECT * FROM public.users fromref
WHERE (fromref."age")::int >= 30
Less Than
{
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Lt, value: 30 }
]
}
{
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Lt, value: 30 }
]
}
SELECT * FROM public.users fromref
WHERE (fromref."age")::int < 30
SELECT * FROM public.users fromref
WHERE (fromref."age")::int < 30
Less Than Or Equal
{
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Lte, value: 30 }
]
}
{
table: 'public.users',
where: [
{ field: 'age', operator: SqlWhereOperator.Lte, value: 30 }
]
}
SELECT * FROM public.users fromref
WHERE (fromref."age")::int <= 30
SELECT * FROM public.users fromref
WHERE (fromref."age")::int <= 30
Like
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.Like, value: 'J%' }
]
}
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.Like, value: 'J%' }
]
}
SELECT * FROM public.users fromref
WHERE fromref."firstName" LIKE 'J%'
SELECT * FROM public.users fromref
WHERE fromref."firstName" LIKE 'J%'
ILike
ILike is the same as Like but case-insensitive
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.ILike, value: 'j%' }
]
}
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.ILike, value: 'j%' }
]
}
SELECT * FROM public.users fromref
WHERE fromref."firstName" ILIKE 'j%'
SELECT * FROM public.users fromref
WHERE fromref."firstName" ILIKE 'j%'
Not Like
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.NotLike, value: 'John' }
]
}
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.NotLike, value: 'John' }
]
}
SELECT * FROM public.users fromref
WHERE fromref."firstName" NOT LIKE 'John'
SELECT * FROM public.users fromref
WHERE fromref."firstName" NOT LIKE 'John'
In
{
table: 'public.users',
where: [
{ field: 'id', operator: SqlWhereOperator.In, value: '(1,2,3)' }
]
}
{
table: 'public.users',
where: [
{ field: 'id', operator: SqlWhereOperator.In, value: '(1,2,3)' }
]
}
SELECT * FROM public.users fromref
WHERE fromref."id" IN (1,2,3)
SELECT * FROM public.users fromref
WHERE fromref."id" IN (1,2,3)
Not In
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.NotIn, value: '(1,2,3)' }
]
}
{
table: 'public.users',
where: [
{ field: 'firstName', operator: SqlWhereOperator.NotIn, value: '(1,2,3)' }
]
}
SELECT * FROM public.users fromref
WHERE fromref."id" NOT IN (1,2,3)
SELECT * FROM public.users fromref
WHERE fromref."id" NOT IN (1,2,3)
Is Null
{
table: 'public.users',
where: [
{ field: 'lastName', operator: SqlWhereOperator.IsNull, value: null }
]
}
{
table: 'public.users',
where: [
{ field: 'lastName', operator: SqlWhereOperator.IsNull, value: null }
]
}
SELECT * FROM public.users fromref
WHERE fromref."id" IS NULL
SELECT * FROM public.users fromref
WHERE fromref."id" IS NULL
NOTE
The value
field is unused in IS NULL
and IS NOT NULL
clauses.
Is Not Null
{
table: 'public.users',
where: [
{ field: 'lastName', operator: SqlWhereOperator.IsNotNull, value: null }
]
}
{
table: 'public.users',
where: [
{ field: 'lastName', operator: SqlWhereOperator.IsNotNull, value: null }
]
}
SELECT * FROM public.users fromref
WHERE fromref."id" IS NOT NULL
SELECT * FROM public.users fromref
WHERE fromref."id" IS NOT NULL
Bitwise AND
{
table: 'public.users',
where: [
{ field: 'id', operator: SqlWhereOperator.BitwiseAnd, value: 2 }
]
}
{
table: 'public.users',
where: [
{ field: 'id', operator: SqlWhereOperator.BitwiseAnd, value: 2 }
]
}
SELECT * FROM public.users fromref
WHERE (fromref."id")::int & 2 > 0
SELECT * FROM public.users fromref
WHERE (fromref."id")::int & 2 > 0
TIP
The bitwise AND operator is useful when storing flag enums in an integer column, where each bit of the integer represents a different boolean value. To check if a particular bit is set, simply check field & bit > 0
.
Combining Clauses
Filtering on multiple columns at once is possible using the andOr
field. E.g.
{
table: 'public.users',
where: [
{ field: 'lastName', operator: SqlWhereOperator.Like, value: 'S%' },
{ andOr: AndOr.Or, field: 'lastName', operator: SqlWhereOperator.IsNull, value: null },
{ andOr: AndOr.And, field: 'age', operator: SqlWhereOperator.Gt, value: 30 },
]
}
{
table: 'public.users',
where: [
{ field: 'lastName', operator: SqlWhereOperator.Like, value: 'S%' },
{ andOr: AndOr.Or, field: 'lastName', operator: SqlWhereOperator.IsNull, value: null },
{ andOr: AndOr.And, field: 'age', operator: SqlWhereOperator.Gt, value: 30 },
]
}
SELECT * FROM public.users fromref
WHERE fromref."lastName" LIKE 'S%'
OR fromref."lastName" IS NULL
AND (fromref."age")::int > 30
SELECT * FROM public.users fromref
WHERE fromref."lastName" LIKE 'S%'
OR fromref."lastName" IS NULL
AND (fromref."age")::int > 30
NOTE
Boolean operators are combined from left to right. Complex combinations involving parenthetical statements like (A OR B) AND (C OR D OR E) are not currently possible.
Filtering on JSON Columns
Filtering is supported on fields nested within JSONB columns as well. To do so, specify the JSONB column in field
as usual, but also add the jsonPath
field with the sub-field(s) to target. E.g.
{
table: 'public.users',
where: [
{
field: 'metadata',
jsonPath: ['website'],
operator: SqlWhereOperator.Like,
value: '%.com'
},
]
}
{
table: 'public.users',
where: [
{
field: 'metadata',
jsonPath: ['website'],
operator: SqlWhereOperator.Like,
value: '%.com'
},
]
}
SELECT * FROM public.users fromref
WHERE fromref."metadata"->>'website' LIKE '%.com'
SELECT * FROM public.users fromref
WHERE fromref."metadata"->>'website' LIKE '%.com'
Or in the case of a nested sub-field:
{
table: 'public.users',
where: [
{
field: 'metadata',
jsonPath: ['links', 'avatar'],
operator: SqlWhereOperator.IsNotNull,
value: null
},
]
}
{
table: 'public.users',
where: [
{
field: 'metadata',
jsonPath: ['links', 'avatar'],
operator: SqlWhereOperator.IsNotNull,
value: null
},
]
}
SELECT * FROM public.users fromref
WHERE fromref."metadata"->'links'->>'avatar' IS NOT NULL
SELECT * FROM public.users fromref
WHERE fromref."metadata"->'links'->>'avatar' IS NOT NULL