홈 › SQL 실무 › 02 / 9

동적 검색 조건

선택 조건, 바인드 변수, IN 목록, 정렬 선택
섹션 6진행 0 / 9

5. 자주 하는 실수 (Tip)

실수 1: NVL·COALESCE 로 조건을 줄여 쓴다

e.dept = NVL(:p, e.dept) 는 짧아서 유혹적이지만 dept 가 NULL 인 행을 빠뜨립니다. 예제 5 가 그 사고입니다. (:p IS NULL OR e.dept = :p) 로 씁니다.

실수 2: 값을 SQL 문자열에 이어 붙인다

"... WHERE name = '" + input + "'" 는 입력에 따라 문장이 바뀝니다. 인젝션 위험이 있고, 값마다 다른 문장이라 계획 재사용도 못 합니다. 값은 항상 바인드 변수(#{}, ?)로 넘깁니다.

실수 3: 정렬 컬럼을 검사 없이 넣는다

ORDER BY ${sortCol} 에 화면에서 온 값을 그대로 넣으면 인젝션이 됩니다. 식별자는 바인드할 수 없으니 허용 목록에서 찾은 값만 넣습니다.

실수 4: 조건이 많은 화면을 (:p IS NULL OR ...) 하나로 둔다

조건이 다섯 개를 넘으면 어떤 조합에서도 맞는 계획이 어려워 인덱스를 못 타는 경우가 생깁니다. 값이 들어온 조건만 붙이는 동적 SQL 로 바꿉니다. MSSQL 은 OPTION (RECOMPILE) 을 쓰기도 합니다.

실수 5: IN 목록이 비었는데 그대로 실행한다

IN () 은 문법 오류이고, Oracle 은 IN 리터럴 1000개를 넘으면 ORA-01795 가 납니다. 목록이 비었는지 먼저 확인하고, 크면 나눠서 조회하거나 임시 표와 조인합니다.