Filter and conditional operators

All the values provided to filter operators and to the sql function are parameterized automatically. For example, this query:

await db.select().from(users).where(eq(users.id, 42));

will be translated to:

select "id", "name", "age" from "users" where "users"."id" = $1; -- params: [42]

We natively support all dialect specific filter and conditional operators.

You can import all filter & conditional from drizzle-orm:

import { eq, ne, gt, gte, ... } from "drizzle-orm";

eq

Value equal to n

import { eq } from "drizzle-orm";

db.select().from(table).where(eq(table.column, 5));
SELECT * FROM "table" WHERE "table"."column" = 5
import { eq } from "drizzle-orm";

db.select().from(table).where(eq(table.column1, table.column2));
SELECT * FROM "table" WHERE "table"."column1" = "table"."column2"

ne

Value is not equal to n

import { ne } from "drizzle-orm";

db.select().from(table).where(ne(table.column, 5));
SELECT * FROM "table" WHERE "table"."column" <> 5
import { ne } from "drizzle-orm";

db.select().from(table).where(ne(table.column1, table.column2));
SELECT * FROM "table" WHERE "table"."column1" <> "table"."column2"

---

gt

Value is greater than n

import { gt } from "drizzle-orm";

db.select().from(table).where(gt(table.column, 5));
SELECT * FROM "table" WHERE "table"."column" > 5
import { gt } from "drizzle-orm";

db.select().from(table).where(gt(table.column1, table.column2));
SELECT * FROM "table" WHERE "table"."column1" > "table"."column2"

gte

Value is greater than or equal to n

import { gte } from "drizzle-orm";

db.select().from(table).where(gte(table.column, 5));
SELECT * FROM "table" WHERE "table"."column" >= 5
import { gte } from "drizzle-orm";

db.select().from(table).where(gte(table.column1, table.column2));
SELECT * FROM "table" WHERE "table"."column1" >= "table"."column2"

lt

Value is less than n

import { lt } from "drizzle-orm";

db.select().from(table).where(lt(table.column, 5));
SELECT * FROM "table" WHERE "table"."column" < 5
import { lt } from "drizzle-orm";

db.select().from(table).where(lt(table.column1, table.column2));
SELECT * FROM "table" WHERE "table"."column1" < "table"."column2"

lte

Value is less than or equal to n.

import { lte } from "drizzle-orm";

db.select().from(table).where(lte(table.column, 5));
SELECT * FROM "table" WHERE "table"."column" <= 5
import { lte } from "drizzle-orm";

db.select().from(table).where(lte(table.column1, table.column2));
SELECT * FROM "table" WHERE "table"."column1" <= "table"."column2"

---

exists

Value exists

import { exists } from "drizzle-orm";

const query = db.select().from(table2)
db.select().from(table).where(exists(query));
SELECT * FROM "table" WHERE EXISTS (SELECT * FROM "table2")

notExists

import { notExists } from "drizzle-orm";

const query = db.select().from(table2)
db.select().from(table).where(notExists(query));
SELECT * FROM "table" WHERE NOT EXISTS (SELECT * FROM "table2")

isNull

Value is null

import { isNull } from "drizzle-orm";

db.select().from(table).where(isNull(table.column));
SELECT * FROM "table" WHERE ("table"."column" IS NULL)

isNotNull

Value is not null

import { isNotNull } from "drizzle-orm";

db.select().from(table).where(isNotNull(table.column));
SELECT * FROM "table" WHERE ("table"."column" IS NOT NULL)

---

inArray

Value is in array of values

import { inArray } from "drizzle-orm";

db.select().from(table).where(inArray(table.column, [1, 2, 3, 4]));
SELECT * FROM "table" WHERE "table"."column" IN (1, 2, 3, 4)
import { inArray } from "drizzle-orm";

const query = db.select({ data: table2.column }).from(table2);
db.select().from(table).where(inArray(table.column, query));
SELECT * FROM "table" WHERE "table"."column" IN (SELECT "table2"."column" FROM "table2")

notInArray

Value is not in array of values

import { notInArray } from "drizzle-orm";

db.select().from(table).where(notInArray(table.column, [1, 2, 3, 4]));
SELECT * FROM "table" WHERE "table"."column" NOT IN (1, 2, 3, 4)
import { notInArray } from "drizzle-orm";

const query = db.select({ data: table2.column }).from(table2);
db.select().from(table).where(notInArray(table.column, query));
SELECT * FROM "table" WHERE "table"."column" NOT IN (SELECT "table2"."column" FROM "table2")

---

between

Value is between two values

import { between } from "drizzle-orm";

db.select().from(table).where(between(table.column, 2, 7));
SELECT * FROM "table" WHERE "table"."column" BETWEEN 2 AND 7

notBetween

Value is not between two value

import { notBetween } from "drizzle-orm";

db.select().from(table).where(notBetween(table.column, 2, 7));
SELECT * FROM "table" WHERE "table"."column" NOT BETWEEN 2 AND 7

---

like

Value is like other value, case sensitive

import { like } from "drizzle-orm";

db.select().from(table).where(like(table.column, "%llo wor%"));
SELECT * FROM "table" WHERE "table"."column" LIKE '%llo wor%'

notLike

Value is not like other value, case sensitive

import { notLike } from "drizzle-orm";

db.select().from(table).where(notLike(table.column, "%llo wor%"));
SELECT * FROM "table" WHERE "table"."column" NOT LIKE '%llo wor%'

ilike

Value is like some other value, case insensitive

import { ilike } from "drizzle-orm";

db.select().from(table).where(ilike(table.column, "%llo wor%"));
SELECT * FROM "table" WHERE "table"."column" ILIKE '%llo wor%'

notIlike

Value is not like some other value, case insensitive

import { notIlike } from "drizzle-orm";

db.select().from(table).where(notIlike(table.column, "%llo wor%"));
SELECT * FROM "table" WHERE "table"."column" NOT ILIKE '%llo wor%'

---

not

All conditions must return false.

import { eq, not } from "drizzle-orm";

db.select().from(table).where(not(eq(table.column, 5)));
SELECT * FROM "table" WHERE NOT ("table"."column" = 5)

and

All conditions must return true.

import { gt, lt, and } from "drizzle-orm";

db.select().from(table).where(and(gt(table.column, 5), lt(table.column, 7)));
SELECT * FROM "table" WHERE ("table"."column" > 5 AND "table"."column" < 7)

or

One or more conditions must return true.

import { gt, lt, or } from "drizzle-orm";

db.select().from(table).where(or(gt(table.column, 5), lt(table.column, 7)));
SELECT * FROM "table" WHERE ("table"."column" > 5 OR "table"."column" < 7)

---

arrayContains

Test that a column or expression contains all elements of the list passed as the second argument

import { arrayContains } from "drizzle-orm";

const contains = await db.select({ id: posts.id }).from(posts)
  .where(arrayContains(posts.tags, ['Typescript', 'ORM']));

const withSubQuery = await db.select({ id: posts.id }).from(posts)
  .where(arrayContains(
    posts.tags,
    db.select({ tags: posts.tags }).from(posts).where(eq(posts.id, 1)),
  ));
select "id" from "posts" where "posts"."tags" @> {Typescript,ORM};
select "id" from "posts" where "posts"."tags" @> (select "tags" from "posts" where "posts"."id" = 1);

arrayContained

Test that the list passed as the second argument contains all elements of a column or expression

import { arrayContained } from "drizzle-orm";

const contained = await db.select({ id: posts.id }).from(posts)
  .where(arrayContained(posts.tags, ['Typescript', 'ORM']));
select "id" from "posts" where "posts"."tags" <@ {Typescript,ORM};

arrayOverlaps

Test that a column or expression contains any elements of the list passed as the second argument.

import { arrayOverlaps } from "drizzle-orm";

const overlaps = await db.select({ id: posts.id }).from(posts)
  .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']));
select "id" from "posts" where "posts"."tags" && {Typescript,ORM}