database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 30651 게시물 읽기
No. 30651
case 문 질문 간략
작성자
김영후(younghoo)
작성일
2013-10-21 17:32
조회수
11,066

SQL 왕초보입니다.  다음과 같은 case 문은 어떻게 해석해야 할까요?

답변 주시면 감사드리겠습니다.

 

where 

  CASE 1  IS  NULL OR  1=''

          WHEN 0 THEN a.cnumber like 1 ELSE 1=1 END 

이 글에 대한 댓글이 총 6건 있습니다.

CASE ? IS NULL OR ? ='' -- 입력된 조건값이 널인지 확인하는 조건
WHEN 0                  -- 0은 위 조건식이 만족하지 않는다는 의미
THEN a.cnumber like ?   -- 입력값이 널이 아닐 경우 실행될 조건식
ELSE 1=1                -- 입력값이 널일 경우 실행될 조건식
END

전체적으로 해석하면
조건값이 입력되면, 해당 조건값으로 조건을 주고 WHERE a.cnumber like ?
조건값이 입력되지 않으면, 전체조회 WHERE 1=1
조건값의 입력여부에 따라 조건식을 달리하고자 할때 사용하는 방법

마농(manon94)님이 2013-10-21 18:14에 작성한 댓글입니다.

마농님 감사합니다.

자세히 설명해주셔서 잘 이해됬습니다. ^^

 

김영후(younghoo)님이 2013-10-22 15:32에 작성한 댓글입니다.

제가 MySQL은 잘 안 써봐서 그런데요...

WHERE ( ? IS NULL ) OR ( ? = '' ) OR ( a.cnumber LIKE ? )

를 보기 어렵게 써 놓은 거라고 이해해도 될까요? (아니면 의미적으로 다른 부분이 있거나, MySQL에서는 실행이 안된다거나... --_--;; ) 

우욱님이 2013-10-23 08:59에 작성한 댓글입니다. Edit

우욱님 좋은 정말 좋은 지적이네요.

해당 구문을 어렵게 Case 로 풀어낸 것 맞네요.

정확히 다른 AND 구문과 구별하려면 전체 괄호 하나 더 하거나 안쪽괄호는 빼야 할 듯.

WHERE ( ? IS NULL  OR  ? = ''  OR  a.cnumber LIKE ? )

저도 오라클만 익숙해서 이런 Case 구문은 에러나겠지 하고 테스트 해보니 되네요.

오라클에서의 표현식은 컬럼, 상수, 계산식, 함수 등이 오는데 조건식은 못오죠.

MySQL에서의 표현식에는 조건식도 올 수 있네요. 

조건식의 결과는 1과 0으로 표현되구요.

마농(manon94)님이 2013-10-23 11:01에 작성한 댓글입니다.
이 댓글은 2013-10-23 11:02에 마지막으로 수정되었습니다.

 두분 댓글과 답변 감사드립니다.

쿼리에 익숙치 않은데, 기존 작성된 문장이 있어서 해석을 부탁드린 것입니다.

마농님 설명처럼 화면에서 입력한 검색 조건값 유무에 따라 검색조건을 달리 하는 것입니다.

저도 처음에 이게 무슨 뜻인가 했다가 마농님 설명 보고 알았습니다.

그래서 복잡한 쿼리를 바꾸고 싶은데  제가  sql 초보다 보니 ..

그래서 다시 질문드리는데,  제가 위에서 질문한 문장은 본래 ibatis 를 사용합니다.

아래와 같이 됩니다. ? 에 조건값이 들어 갑니다.

  

WHERE CASE ? IS NULL OR ?='' WHEN 0 THEN a.cnumber like ? ELSE 1=1 END 
AND CASE ? IS NULL WHEN 0 THEN a.reg_date>=? ELSE 1=1 END 
AND CASE ? IS NULL WHEN 0 THEN a.reg_date<=? ELSE 1=1 END 
AND CASE ?=0 WHEN 0 THEN a.cam_id=? ELSE 1=1 END 
 

이걸 좀 쉬운 구문(직관적인) 으로 바꿀 수 있을까요?

부탁드립니다.

 

 

 

 

 

김영후(younghoo)님이 2013-10-23 12:07에 작성한 댓글입니다.
이 댓글은 2013-10-23 12:08에 마지막으로 수정되었습니다.

-- 정적 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>

마농(manon94)님이 2013-10-23 16:44에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
30654JSP 프로그램 실행중 이러한 DB Error가 발생했습니다.
DB 초보
2013-10-29
9779
30653mysql ERROR 3 (Errcode: 28) [1]
주진희
2013-10-29
14311
30652mysql 변환 질문 [1]
김강신
2013-10-29
9045
30651case 문 질문 간략 [6]
김영후
2013-10-21
11066
30649제발 도와주세요 ㅠㅠ
임홍래
2013-10-20
9304
306483개의 테이블 데이터를 하나로 불러오려면요?
2013-10-10
8962
30647기존에 만들어놓은 trigger 보는 방법? [2]
윤민승
2013-10-08
9425
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다