SQL 왕초보입니다. 다음과 같은 case 문은 어떻게 해석해야 할까요?
답변 주시면 감사드리겠습니다.
where
CASE 1 IS NULL OR 1=''
WHEN 0 THEN a.cnumber like 1 ELSE 1=1 END
CASE ? IS NULL OR ? ='' -- 입력된 조건값이 널인지 확인하는 조건 WHEN 0 -- 0은 위 조건식이 만족하지 않는다는 의미 THEN a.cnumber like ? -- 입력값이 널이 아닐 경우 실행될 조건식 ELSE 1=1 -- 입력값이 널일 경우 실행될 조건식 END
전체적으로 해석하면 조건값이 입력되면, 해당 조건값으로 조건을 주고 WHERE a.cnumber like ? 조건값이 입력되지 않으면, 전체조회 WHERE 1=1 조건값의 입력여부에 따라 조건식을 달리하고자 할때 사용하는 방법
마농님 감사합니다.
자세히 설명해주셔서 잘 이해됬습니다. ^^
제가 MySQL은 잘 안 써봐서 그런데요...
WHERE ( ? IS NULL ) OR ( ? = '' ) OR ( a.cnumber LIKE ? )
를 보기 어렵게 써 놓은 거라고 이해해도 될까요? (아니면 의미적으로 다른 부분이 있거나, MySQL에서는 실행이 안된다거나... --_--;; )
우욱님 좋은 정말 좋은 지적이네요.
해당 구문을 어렵게 Case 로 풀어낸 것 맞네요.
정확히 다른 AND 구문과 구별하려면 전체 괄호 하나 더 하거나 안쪽괄호는 빼야 할 듯.
WHERE ( ? IS NULL OR ? = '' OR a.cnumber LIKE ? )
저도 오라클만 익숙해서 이런 Case 구문은 에러나겠지 하고 테스트 해보니 되네요.
오라클에서의 표현식은 컬럼, 상수, 계산식, 함수 등이 오는데 조건식은 못오죠.
MySQL에서의 표현식에는 조건식도 올 수 있네요.
조건식의 결과는 1과 0으로 표현되구요.
두분 댓글과 답변 감사드립니다.
쿼리에 익숙치 않은데, 기존 작성된 문장이 있어서 해석을 부탁드린 것입니다.
마농님 설명처럼 화면에서 입력한 검색 조건값 유무에 따라 검색조건을 달리 하는 것입니다.
저도 처음에 이게 무슨 뜻인가 했다가 마농님 설명 보고 알았습니다.
그래서 복잡한 쿼리를 바꾸고 싶은데 제가 sql 초보다 보니 ..
그래서 다시 질문드리는데, 제가 위에서 질문한 문장은 본래 ibatis 를 사용합니다.
아래와 같이 됩니다. ? 에 조건값이 들어 갑니다.
이걸 좀 쉬운 구문(직관적인) 으로 바꿀 수 있을까요?
부탁드립니다.
-- 정적 SQL 구문만으로 한다면 다음과 같겠지요. WHERE (CASE ? IS NULL OR ? = '' OR a.cnumber like ?) AND (CASE ? IS NULL OR ? = '' OR a.reg_date >= ?) AND (CASE ? IS NULL OR ? = '' OR a.reg_date <= ?) AND (CASE ? = 0 OR a.cam_id = ?) -- ibatis 는 동적 SQL을 편리하게 지원하는 걸로 압니다. -- 아래는 웹서핑을 통해 처음으로 작성해본 ibatis 소스 <dynamic prepend="WHERE"> <isNotEmpty prepend="AND" property="cnumber"> a.cnumber LIKE #cnumber# </isNotEmpty> <isNotEmpty prepend="AND" property="reg_date_from"> a.reg_date >= #reg_date_from# </isNotEmpty> <isNotEmpty prepend="AND" property="reg_date_to"> a.reg_date <= #reg_date_to# </isNotEmpty> <isNotEmpty prepend="AND" property="cam_id"> a.cam_id = #cam_id# </isNotEmpty> </dynamic>