반응형
/********************************************************************************************
-- Title : [2k5] CASE문을 이용한 동적쿼리의 정적쿼리 변환
-- Reference : 필라넷 김정선님, http://dbrang.tistory.com/263
-- Key word : 동적쿼리 정적쿼리 CASE
********************************************************************************************/
USE AdventureWorks;
GO
-- Title : [2k5] CASE문을 이용한 동적쿼리의 정적쿼리 변환
-- Reference : 필라넷 김정선님, http://dbrang.tistory.com/263
-- Key word : 동적쿼리 정적쿼리 CASE
********************************************************************************************/
USE AdventureWorks;
GO
-- WHERE 절에서의 동적 쿼리
DECLARE @COLUMN VARCHAR(10), @VALUE VARCHAR(20);
SET @COLUMN = 'first';
SET @VALUE = 'b%';
DECLARE @COLUMN VARCHAR(10), @VALUE VARCHAR(20);
SET @COLUMN = 'first';
SET @VALUE = 'b%';
SELECT *
FROM Person.Contact
WHERE (CASE @COLUMN WHEN 'Last' THEN LastName
WHEN 'First' THEN FirstName
WHEN 'Title' THEN Title
ELSE @VALUE
END
) LIKE @VALUE;
FROM Person.Contact
WHERE (CASE @COLUMN WHEN 'Last' THEN LastName
WHEN 'First' THEN FirstName
WHEN 'Title' THEN Title
ELSE @VALUE
END
) LIKE @VALUE;
-- SELECT 절에서의 동적 쿼리
DECLARE @COLUMN VARCHAR(10);
SET @COLUMN = 'title';
SELECT ContactID
, CASE @COLUMN WHEN 'Name' THEN LastName
WHEN 'Title' THEN Title
ELSE LastName
END "COLUMN1"
, CASE @COLUMN WHEN 'Name' THEN FirstName
WHEN 'Title' THEN LastName
ELSE CONVERT(NCHAR(10), modifieddate, 112)
END "COLUMN2"
, CASE @COLUMN WHEN 'Title' THEN CONVERT(NCHAR(10), ModifiedDate, 112)
ELSE ''
END "COLUMN3"
FROM Person.Contact;
, CASE @COLUMN WHEN 'Name' THEN LastName
WHEN 'Title' THEN Title
ELSE LastName
END "COLUMN1"
, CASE @COLUMN WHEN 'Name' THEN FirstName
WHEN 'Title' THEN LastName
ELSE CONVERT(NCHAR(10), modifieddate, 112)
END "COLUMN2"
, CASE @COLUMN WHEN 'Title' THEN CONVERT(NCHAR(10), ModifiedDate, 112)
ELSE ''
END "COLUMN3"
FROM Person.Contact;
-- ORDER BY 절에서의 동적 쿼리
DECLARE @OrderBy VARCHAR(10);
SET @OrderBy = 'Fisrt';
SELECT *
FROM Person.Contact
ORDER BY (CASE @OrderBy WHEN 'Last' THEN LastName
WHEN 'First' THEN FirstName
WHEN 'Title' THEN Title
END
) ASC;
FROM Person.Contact
ORDER BY (CASE @OrderBy WHEN 'Last' THEN LastName
WHEN 'First' THEN FirstName
WHEN 'Title' THEN Title
END
) ASC;
-- ORDER BY 절에서의 동적 쿼리 2
DECLARE @OrderBy VARCHAR(10), @SEQUENCE VARCHAR(4);
SET @OrderBy = 'LastName';
SET @SEQUENCE = 'DESC';
SELECT *
FROM Person.Contact
ORDER BY (CASE @SEQUENCE WHEN 'ASC'
THEN CASE @OrderBy WHEN 'LastName' THEN LastName
WHEN 'Title' THEN Title
END
END
) ASC
, (CASE @SEQUENCE WHEN 'DESC'
THEN CASE @OrderBy WHEN 'LastName' THEN LastName
WHEN 'Title' THEN Title
END
END
) DESC;
FROM Person.Contact
ORDER BY (CASE @SEQUENCE WHEN 'ASC'
THEN CASE @OrderBy WHEN 'LastName' THEN LastName
WHEN 'Title' THEN Title
END
END
) ASC
, (CASE @SEQUENCE WHEN 'DESC'
THEN CASE @OrderBy WHEN 'LastName' THEN LastName
WHEN 'Title' THEN Title
END
END
) DESC;
-- ORDER BY 절에서의 CASE를 활용안 ASC/DESC 처리
-- 나머지는 http://dbrang.tistory.com/263 에서 확인.
select a.skey, row_number() over(order by (case when @ord_sect = 'ASC' then a.appl_dt end) ASC
, (case when @ord_sect = 'DESC' then a.appl_dt end) DESC
, skey ASC
) "ttt"
, a.appl_dt
from
(
Subquery
) a ;
-- 나머지는 http://dbrang.tistory.com/263 에서 확인.
반응형