Drizzle | 쿼리에서 조건부 필터 사용하기
PostgreSQL
MySQL
SQLite
This guide assumes familiarity with:

쿼리에서 조건부 필터를 사용하려면 .where() 메서드와 논리 연산자를 활용할 수 있습니다. 아래 예제를 참고하세요.

import { ilike } from 'drizzle-orm';

const db = drizzle(...)

const searchPosts = async (term?: string) => {
  await db
    .select()
    .from(posts)
    .where(term ? ilike(posts.title, term) : undefined);
};

await searchPosts();
await searchPosts('AI');
select * from posts;
select * from posts where title ilike 'AI';

여러 조건부 필터를 조합하려면 and() 또는 or() 연산자를 사용할 수 있습니다.

import { and, gt, ilike, inArray } from 'drizzle-orm';

const searchPosts = async (term?: string, categories: string[] = [], views = 0) => {
  await db
    .select()
    .from(posts)
    .where(
      and(
        term ? ilike(posts.title, term) : undefined,
        categories.length > 0 ? inArray(posts.category, categories) : undefined,
        views > 100 ? gt(posts.views, views) : undefined,
      ),
    );
};

await searchPosts();
await searchPosts('AI', ['Tech', 'Art', 'Science'], 200);
select * from posts;
select * from posts
  where (
    title ilike 'AI'
    and category in ('Tech', 'Science', 'Art')
    and views > 200
  );

프로젝트의 다른 부분에서 조건부 필터를 조합해야 한다면, 변수를 생성하고 필터를 추가한 후 .where() 메서드와 and() 또는 or() 연산자를 사용할 수 있습니다.

import { SQL, ... } from 'drizzle-orm';

const searchPosts = async (filters: SQL[]) => {
  await db
    .select()
    .from(posts)
    .where(and(...filters));
};

const filters: SQL[] = [];
filters.push(ilike(posts.title, 'AI'));
filters.push(inArray(posts.category, ['Tech', 'Art', 'Science']));
filters.push(gt(posts.views, 200));

await searchPosts(filters);

Drizzle은 유용하고 유연한 API를 제공하여 커스텀 솔루션을 만들 수 있습니다. 아래는 커스텀 필터 연산자를 만드는 방법입니다.

import { AnyColumn, ... } from 'drizzle-orm';

// 길이가 특정 값보다 작은지 확인
const lenlt = (column: AnyColumn, value: number) => {
  return sql`length(${column}) < ${value}`;
};

const searchPosts = async (maxLen = 0, views = 0) => {
  await db
    .select()
    .from(posts)
    .where(
      and(
        maxLen ? lenlt(posts.title, maxLen) : undefined,
        views > 100 ? gt(posts.views, views) : undefined,
      ),
    );
};

await searchPosts(8);
await searchPosts(8, 200);
select * from posts where length(title) < 8;
select * from posts where (length(title)  200);

Drizzle의 필터 연산자는 내부적으로 SQL 표현식입니다. 아래는 Drizzle에서 lt 연산자가 어떻게 구현되었는지 보여주는 예제입니다.

const lt = (left, right) => {
  return sql`${left} < ${bindIfParam(right, left)}`; // bindIfParam은 내부 매직 함수
};