6. 정리
선택 조건은 (p IS NULL OR col = p) 로 씁니다. NVL·IFNULL·ISNULL·COALESCE 로 col = f(p, col) 형태로 줄이면 col 이 NULL 인 행이 빠지는데, 12행 중 11행이 나온 것으로 확인했습니다.
LIKE 는 '%' || p || '%' 이고 입력이 NULL 이면 결과가 비므로 IS NULL 검사를 함께 둡니다. 빈 문자열은 Oracle 에서는 NULL, MySQL·MSSQL 에서는 NULL 이 아니라서 화면에서 NULL 로 정리해 보냅니다.
바인드 변수는 문장이 같아 계획을 재사용하고 인젝션을 막습니다. IN 목록은 개수가 변하고 빈 목록은 문법 오류이며, Oracle 은 리터럴 1000개까지입니다. 정렬 컬럼 같은 식별자는 바인드할 수 없어 화이트리스트로 검사하고, CASE 한 개에는 같은 타입만 넣습니다.
조건이 많은 화면은 (:p IS NULL OR ...) 하나로는 인덱스를 못 타는 경우가 있어, MyBatis <where>·<if>·<foreach> 같은 동적 SQL 로 필요한 조건만 붙입니다. #{} 는 바인드, ${} 는 문자열 치환입니다.
다음 레슨은 이력 테이블과 시점 조회입니다. 시작일·종료일이 있는 이력 행에서 특정 날짜 기준의 값을 찾는 방법을 다룹니다.