출처 블로그 > Developer's Note
원본 http://blog.naver.com/taekani/130015877476

자 이번에 소개해 드릴 녀석들이 바로 T-SQL 프로그래밍의 꽃이라고 할 수 있는

그런 녀석들 입니다. 마치 소면과 채소 사이에 숨어있는 진짜 쫄깃한 골뱅이라고도

표현이 가능하겠지요. 갑자기 맥주 한잔이 땡기는군요.

 

첫번째인 변수 선언 입니다.

변수의 선언법은 아시겠죠?

DECLARE @변수명 자료형

하시면 변수가 생성되는 것입니다.

여기에 값을 대입 하려면?

SET @변수명 = 값

이런 식이 되지요.

 

DECLARE @변수1 int
SET @변수1 = 10
SELECT @변수1

 

간단히 보시면 저런 식이 됩니다. 어렵지 않으시져?

이미 커서와 저장 프로시져 등에서 많이 봐 오셔서 어렵지는 않으실 거에요.

 

다음 IF - ELSE 입니다. 분기라는 것만 생각하세요.

 

IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
   BEGIN
      PRINT 'The following titles are excellent mod_cook books:'
      PRINT ' '
      SELECT SUBSTRING(title, 1, 35) AS Title
      FROM titles
      WHERE type = 'mod_cook'
   END
ELSE
   PRINT 'Average title price is more than $15.'

 

또는 이를 중첩 하신후. ^_^

 

IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') < $15
   BEGIN
      PRINT 'The following titles are excellent mod_cook books:'
      PRINT ' '
      SELECT SUBSTRING(title, 1, 35) AS Title
      FROM titles
      WHERE type = 'mod_cook'
   END
ELSE
   IF (SELECT AVG(price) FROM titles WHERE type = 'mod_cook') > $15
      BEGIN
         PRINT 'The following titles are expensive mod_cook books:'
         PRINT ' '
         SELECT SUBSTRING(title, 1, 35) AS Title
         FROM titles
         WHERE type = 'mod_cook'
      END

이렇게 구성이 됩니다. if의 끝에 End if가 없지요? ^_^

약간의 차이만 느끼시면 문제 없지요.

느끼시듯이 IF의 구문은

IF Boolean_expression
     { sql_statement | statement_block }
[ ELSE
     { sql_statement | statement_block } ]

이런 식입니다.

주의하실점으로 IF 후 처리한 루틴에서 여러 처리가 들어갈시 반드시

BEGIN - END로 블럭을 지정해 단위별로 수행을 하셔야만 합니다.

BEGIN - END로 묶지 않을시는? 에러가 나거나 첫 단위만 수행합니다.

 

다음은 WHILE구문 입니다.

 

USE pubs
GO
WHILE (SELECT AVG(price) FROM titles) < $30
   BEGIN
      UPDATE titles
         SET price = price * 2
      SELECT MAX(price) FROM titles
      IF (SELECT MAX(price) FROM titles) > $50
         BREAK
      ELSE
         CONTINUE
   END
   PRINT 'Too much for the market to bear'

 

일반적으로 이러한 식의 처리로 조건이 맞을때 까지 루프를 돌면서

처리하게 됩니다. 적절한 방식으로 비교 루틴을 두신후 돌리시면 되지요.

WHILE의 구문은

WHILE Boolean_expression
     { sql_statement | statement_block }
     [ BREAK ]
     { sql_statement | statement_block }
     [ CONTINUE ]

의 식입니다.

BREAK는 WHILE구문을 끝내며

CONTINUE는 WHILE 루프를 다시 시작하게 합니다.

 

다음 CASE입니다.

CASE구문 정보를 먼저 봐 보지요.

 

단순 CASE 함수

CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END

검색된 CASE 함수
CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END

단순 처리시 입니다.

 

USE pubs
GO
SELECT Category =
   CASE type
      WHEN 'popular_comp' THEN 'Popular Computing'
      WHEN 'mod_cook' THEN 'Modern Cooking'
      WHEN 'business' THEN 'Business'
      WHEN 'psychology' THEN 'Psychology'
      WHEN 'trad_cook' THEN 'Traditional Cooking'
   ELSE 'Not yet categorized'
   END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
GO

역시나 CASE샘플로 비교값을 가지는 케이스 입니다.

 

USE pubs
GO
SELECT 'Price Category' =
   CASE
      WHEN price IS NULL THEN 'Not yet priced'
      WHEN price < 10 THEN 'Very Reasonable Title'
      WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
   ELSE 'Expensive book!'
   END,
CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
GO

이러한 부분 입니다.

 

좀더 유연한 CASE 처리를 위해 문자열 처리 함수와 혼용하는 샘플 입니다.

 

USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ' '+
RTRIM(a.au_lname) + ' '), 1, 25) AS Name, a.au_id, ta.title_id,
Type =
   CASE
      WHEN SUBSTRING(ta.title_id, 1, 2) = 'BU' THEN 'Business'
      WHEN SUBSTRING(ta.title_id, 1, 2) = 'MC' THEN 'Modern Cooking'
      WHEN SUBSTRING(ta.title_id, 1, 2) = 'PC' THEN 'Popular Computing'
      WHEN SUBSTRING(ta.title_id, 1, 2) = 'PS' THEN 'Psychology'
      WHEN SUBSTRING(ta.title_id, 1, 2) = 'TC' THEN 'Traditional Cooking'
   END
FROM titleauthor ta JOIN authors a ON ta.au_id = a.au_id

천천히 샘플을 수행해 보세요. 이게 어떤 종류구나가 중요한게 아니라..

CASE구문으로 IF ELSE의 중첩을 많이 막을 수 있으며 매우 유용합니다. ^_^

 

다음은 CASE함수와 비슷한 처리가 가능하지만 한큐로 수행이 가능한 유용한 함수 입니다.

NULLIF 입니다.

이는 NULLIF(expression1, expression2)

식이며 두 값이나 표현식이 같은 경우에 NULL을 반환합니다.

즉.. 조금더 생각해 보시면

계산된 평균값에 어떤 특정 값이 포함되지 않기를 원하는 경우에

사용될 수 있지요.

이하 두개의 질의를 비교해 보세요.

 

SELECT royaltyper
FROM titleauthor

SELECT NULLIF(royaltyper, 100)
FROM titleauthor

 

 

다음은 COALESCE 입니다.

역시나 간단합니다.

COALESCE(expression1, expression2, ….. , expressionN)

한 구문이 있을 경우...

NULL이 아닌 처음 값을 표현식부터 찾습니다. ^_^

아래의 INSERT 되는 데이터를 봐 보세요.

테이블을 아래와 같이 설계 하신후..  앞의 컬럼의 값부터 NULL이 아닌

값을 찾으려 한다면?

 

SET NOCOUNT ON
GO

CREATE TABLE wages
(
emp_id tinyint identity,
hourly_wage decimal NULL,
salary decimal NULL,
commission decimal NULL,
num_sales tinyint NULL
)
GO

INSERT wages VALUES(10.00, NULL, NULL, NULL)
INSERT wages VALUES(20.00, NULL, NULL, NULL)
INSERT wages VALUES(30.00, NULL, NULL, NULL)
INSERT wages VALUES(40.00, NULL, NULL, NULL)
INSERT wages VALUES(NULL, 10000.00, NULL, NULL)
INSERT wages VALUES(NULL, 20000.00, NULL, NULL)
INSERT wages VALUES(NULL, 30000.00, NULL, NULL)
INSERT wages VALUES(NULL, 40000.00, NULL, NULL)
INSERT wages VALUES(NULL, NULL, 15000, 3)
INSERT wages VALUES(NULL, NULL, 25000, 2)
INSERT wages VALUES(NULL, NULL, 20000, 6)
INSERT wages VALUES(NULL, NULL, 14000, 4)
GO

SET NOCOUNT OFF
GO

SELECT COALESCE(hourly_wage, salary, commission * num_sales)
FROM wages
GO

자 여기까지 입니다. ~~~  수고하셨습니다.

이곳까지가 개발자 분이라면 꼬옥 봐 두어야할 SQL서버 개발에 필요한 부분의 정리라고

보시면 됩니다. - 이하 부분은 문제상황이 발생하거나 다른 처리를 원하실때 찬찬히

보시면 되구요. ^_^

이제 프로그래밍 부분도 마무리가 다행히 되었군요. ^_^

다음장부터는 조금 난해해 질 수 있습니다. - 여기까지 보셨으니 이제 초보자 분은

아니신 겁니다. ^_^

자 수고하셨구요.   -  이제는 실제 자신의 업무에 적용하면서..

덕지덕지한 어플리케이션.. ASP나 VB의 코드를..  앞의 많은 내용을 통해

한줄로 줄여 보시길 바랍니다. ^_^

[출처] View 테이블 Mssql |작성자 여유

Posted by 아로스

아로스

달력