안녕하세요. 소스 분석중에 이해가 되질 않는 SQL 구문이 있어서 질문 드립니다~ SELECT * FROM TEMP WHERE USE_YN = (CASE WHEN 'N' IS NULL THEN USE_YN ELSE 'N' END); 위와 같이 조건절에 CASE 문을 사용했는데 TEMP 테이블의 USE_YN 이 'N' 인데 NULL 이면 USE_YN 값 USE_YN 이 'N' 인데 NULL 이 아니면 'N' 인것들만 가져온다고 작성된 SQL 인거 같은데 'N' 이 NULL 일때 USE_YN 값 조건이 왜 이렇게 작성된건지 이해가 되질 않네요;; 잘못 작성된 SQL 문 같은데 제가 생각하는게 맞는건가요?
'N' 부분은 입력 변수입니다. (Y, N, NULL 3가지 값이 입력될 것입니다.)
(CASE WHEN 'N' IS NULL THEN USE_YN ELSE 'N' END)
(CASE WHEN :use_yn IS NULL THEN USE_YN ELSE :use_yn END) <-- 이런 식입니다.
입력 변수에 값이 들어오면 변수와 비교하고 (use_yn = :v_use_yn)
입력 변수에 값이 들어오지 않으면 자기 자신과 비교 (use_yn = use_yn)
자기 자신의 값과 비교하면 당연히 같은 값이라서 참이 됩니다.
결론은 입력변수값이 들어오지 않으면 전체 조회하는 것이 됩니다.
단, 제약사항으로 테이블의 use_yn 에는 NULL 값이 저장되어 있지 않아야 합니다.
널일 경우 비교식(null = null)이 참이 될 수 없습니다.
-- 정리 --
0. 테이블의 use_yn 에는 NULL 값이 저장되어 있지 않다는 가정 하에
1. Y 가 들어오면 Y 만 조회
2. N 가 들어오면 N 만 조회
3. NULL 이 들어오면 전체 조회