그런 녀석들 입니다. 마치 소면과 채소 사이에 숨어있는 진짜 쫄깃한 골뱅이라고도
표현이 가능하겠지요. 갑자기 맥주 한잔이 땡기는군요.
첫번째인 변수 선언 입니다.
변수의 선언법은 아시겠죠?
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의 코드를.. 앞의 많은 내용을 통해
한줄로 줄여 보시길 바랍니다. ^_^