SQL문 조건절에 case 문을 사용했는데 이해가 되질 않네요.. 0 2 2,145

by 바가지 [SQL Query] [2023.07.13 17:49:42]


안녕하세요.

소스 분석중에 이해가 되질 않는 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 문 같은데 제가 생각하는게 맞는건가요?

 

by 필상 [2023.07.14 09:44:47]

제 생각에는 'N'이 변수 같고요 들어오는 값이 null일때는 전체(USE_YN 이 NULL이 아닌)를 보여줄려고 한게 아닐까 보이는데요


by 마농 [2023.07.17 09:12:07]

'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 이 들어오면 전체 조회

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입