dynamic 쿼리를 쓰지 말고 함 구해볼까?
--dynamic 쿼리가 몹시 귀찮은 경우
--다른 컬럼으로 index 를 타고, 필터조건만 처리 할 경우 유용한 쿼리 로직
if object_id ('tblx') is not null
drop table tblx
go
create table tblx
(idx int
,c1 int
,c2 int
)
go
insert into tblx values(1,1,null),(2,null,2),(3,3,3), (4, null,null)
-- @c1 의 값이 null 이면 필터하지 않고, 값이 있으면 값으로 뿌린다.
-- 보통 다음과 같은 쿼리를 짜는데, 이는 null 값에 문제를 일으킨다.
-- 아래 문제를 해결하는 것이 미션 1 이다.
declare @c1 int = null
select *
from tblx
where c1 = case when @c1 is null then c1 else @c1 end
go
-- 해결방안
declare @c1 int = null
select *
from tblx
where (c1 = @c1 or 1=case when @c1 is null then 1 else 0 end)
go
-- @c1 의 값이 9999 이면 필터하지 않고, 값이 있으면 값으로 출력하며, null 이면 null 만 출력한다.
-- 이것이 미션 2 이다.
declare @c1 int = 9999
select *
from tblx
where (c1 = @c1 or 1=case when @c1 = 9999 then 1 else 0 end) or (c1 is null and 1=case when @c1 is null then 1 else 0 end)
go
-- 복합 필터 조건
declare @c1 int = null
declare @c2 int = null
select *
from tblx
where ((c1 = @c1 or 1=case when @c1 = 9999 then 1 else 0 end) or (c1 is null and 1=case when @c1 is null then 1 else 0 end))
and ((c2 = @c2 or 1=case when @c2 = 9999 then 1 else 0 end) or (c2 is null and 1=case when @c2 is null then 1 else 0 end))
go
select *
from tbly
where (a = @col1 or @col1 is null)