파라미터가 null일때 where 조건 안타게 하는 방법 0 17 24,517

by 풀텀 [2013.07.16 10:00:36]


약간 설명이 복잡한데요
파라미터로 name='test'은 넘어옵니다.

하지만 만약 파라미터가 null이라면 where 조건 자체를 안타게 하고싶은데 방법이 있나요?

예) 
파라미터가 NULL일때 : select * from dual
파라미터가 있을때 : select * from dual where name = 'test'
이런식으로 조건절을 아예 안타게 하고 싶습니다.
by 용근님 [2013.07.16 10:04:10]

( ( :req is null and 1 = 1 ) or ( :req is not null and name = 'test' ) )


by 풀텀 [2013.07.16 10:12:16]
예시를 들어주실 수 있을까요?
1) select * from dual where name = 'test'

2) select * from dual where name = ((:req is null and 1=1) or (:req is not null nad name = 'test'))

2)번처럼 해야하는건가요?

by 우리집아찌 [2013.07.16 10:09:05]

쿼리를 두개 짜서 분기시키면 되지않을까요?

by 풀텀 [2013.07.16 10:12:51]
저도 그생각을 했지만 
이런 방법가 가능할지 싶어서요.
방법은 있겠지만 어떻게 해야하는지 알고싶습니다.

by 부쉬맨 [2013.07.16 10:13:41]
코딩에서 처리할수 있따면
if 조건절로 if 파라미터 = null then ' where 관련 문장'

기존 sql + where 절 해서 넘기시는것도 방법..


by 풀텀 [2013.07.16 10:15:27]
코딩처리는 가능하나 쿼리로 가능할거 같아서 방법 구해보고있습니다^^

by DIIIN [2013.07.16 10:13:44]


동적으로 만들어서 not null 인 경우는 where 절 붙이고, null 인 경우는 from 절에서 끝내면 되겠네요.

by 용근님 [2013.07.16 10:19:53]


mybatis라면 if 절을 쓰시면 되겠지만 동적Query는 Sql Injection에 취약하니

 select * from dual where ((:req is null and 1=1) or (:req is not null nad name = 'test'))

이리 하면 되지 않겠습니까


by 용근님 [2013.07.16 10:23:28]
not null 컬럼이라면

WHERE name = decode ( :req, null, name, :req )

by 풀텀 [2013.07.16 10:25:08]
답변대로 해보았지만 제가 원한 결과가 안나오는군요.
제가 원한 결과는 where 절이 없는 전체 검색인데 제 설명이 부족했던거 같습니다. 죄송합니다.

파라미터가 NULL일때 NULL을 포함한 전체 검색이고, 
파라미터가 있다면 해당 파라미터에 대한 결과값만 가져오는 쿼리를 작성하려고 합니다.


쿼리로만 해결해보려 하는데 막히는군요.

답변 감사드립니다.

by 용근님 [2013.07.16 10:40:53]
select * from dual where ((:req is null and 1=1) or (:req is not null and name = 'test'))

이게 원하는 결과가 안나왔다구요?

by 아발란체 [2013.07.16 10:26:15]

myBatis라면 이 방법도 있습니다.

<if test=”name != null”>
name = 'test'
</if>


by 마농 [2013.07.16 10:29:02]

name 이 Not Null 항목이라면?
 WHERE name LIKE :v_name || '%'
 WHERE name = NVL(:v_name, name)
name 이 Not Null 항목이 아니라면?
 WHERE ( (:v_name IS NULL) OR (:v_name IS NOT NULL AND name = :v_name) )


by 풀텀 [2013.07.16 10:36:49]
마농님 감사합니다.
제가 원하는 결과가 나오네요.

by 미카엘 [2013.07.16 10:52:23]
with t as (
select 'aaa' name from dual union all
select 'bbb' name from dual)
select *
  from t
 where name = nvl2(:param, :param, name)

by 풀텀 [2013.07.16 11:11:20]
깔끔하고 간결하네요.

답변 감사합니다.^^

by 야신 [2013.07.16 20:33:11]
WHERE ( :v_name IS NULL OR name = :v_name)
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입