현대의 BI 및 CRM 시스템은 종종 사용자 정의 필터를 구현해야 합니다: 날짜, 성별, 상태, 태그에 대한 임의의 조건을 유연하게 조합하고, SQL 언어로 이를 올바르게 교차하고 결합하는 것이 중요합니다. 결과 코드가 읽기 쉽고 쉽게 수정 가능하며 예상 결과를 제공해야 합니다.
개발자는 종종 "실시간"으로 사용자 정의 필터로부터 AND/OR의 많은 조건을 포함한 WHERE를 생성하며, 이는 논리적 오류와 유지 관리가 어려운 쿼리로 이어집니다. 필터 값이 없거나 IN/EXISTS/LIKE와 조합될 수 있다면 문제는 더욱 심각해집니다.
동적 필터에 대해 "조건이 없으면 항상 TRUE인 OR 조건" 패턴이 유용합니다:
SELECT * FROM users WHERE (status = @status OR @status IS NULL) AND (gender = @gender OR @gender IS NULL) AND (created >= @from_date OR @from_date IS NULL) AND (city IN (@cities) OR @cities IS NULL);
또는 동적 SQL을 사용하여:
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM users WHERE 1=1'; IF @status IS NOT NULL SET @sql += N' AND status = @status'; IF @gender IS NOT NULL SET @sql += N' AND gender = @gender'; -- ... EXEC sp_executesql @sql, N'@status NVARCHAR(10),@gender NVARCHAR(10)', @status, @gender;
주요 특징:
조건이 있을 때 WHERE 1=1을 언제나 사용할 수 있습니까?
아니오, 1=1은 WHERE를 연결하기 위한 시작 조건일 뿐입니다 — 필터를 대체하는 것이 아니라 쿼리 생성을 용이하게 하는 데만 사용됩니다.
IN()에 빈 목록이 포함될 경우 어떤 문제가 발생할 수 있습니까?
IN (NULL) 또는 IN ()은 항상 false를 반환하며, 필터가 없더라도 빈 집합을 반환합니다. 올바르게 작동하도록 하려면 빈 목록을 별도로 확인하고 조건을 포함하지 않아야 합니다.
이런 구조가 인덱스 및 성능에 미치는 영향은 무엇인가요?
필터가 OR 또는 NULL 체크가 포함된 경우, 많은 데이터베이스 관리 시스템이 인덱스를 효과적으로 사용하지 못하게 되며, 전체 테이블 스캔이 수행될 수 있습니다. 실행 계획이 인덱스를 선택할 수 있도록 동적 SQL 또는 매개변수화된 쿼리를 사용하는 접근 방식을 적용해야 합니다.
10개의 필터로 구성된 전형적인 보고서, 코드가 많은 OR을 포함한 WHERE를 생성하며 — 여러 필터가 없을 경우 결과가 빈 집합으로 나오거나 너무 큰 스캔이 발생해 서버에 부하가 급증합니다.
장점:
별도의 함수가 지정된 매개변수에 따라 필터를 형성하고, 각 조건 그룹에 대해 별도의 JOIN/FILTER만 포함됩니다. Where는 OR 및 NULL 체크가 포함되지 않습니다.
장점: