꽤나 오래전부터 검색해봐도 적절한 결과를 얻지 못했었는데
오늘에야 발견... 뒷북일 가능성도 농후합니다만, 포스팅해봅니다


먼저 원문 주소 나갑니다

http://weblogs.sqlteam.com/brettk/archive/2005/02/02/4095.aspx

가장 생각하기 쉽고, 또 제가 얼마전까지 사용해왔던 while 문에 대해
Terrific looping technique! 이라고 지껄여 주는 저 센스...


다음은 제가 필요에 의해 간소화한 응용편 소스 나갑니다

--pivot table은 미리 생성하고 필요한만큼 로우 생성
create table pivot(
seq int not null primary key
)

declare @seq int
select @seq = 1
while @seq <= 100
begin
insert into pivot values(@seq)
select @seq = @seq + 1
end
go

declare @str varchar(1000), @delim varchar(10)
select @str = '1,2,3,4,5,6,7,8,9,0', @delim = ','

select substring(@str, pos1+1, case pos2 when 0 then len(@str) - pos1 else pos2 - pos1 - 1 end) as token
from
(
select pos1,charindex(@delim,@str,pos1+1) pos2 from
(
select charindex(@delim,@str,seq) pos1
from pivot
where seq <= len(@str)
) d1 group by pos1
) d2
order by pos1
go

뭐, 굳이 실행안해보셔도 결과는 예상하시다시피 다음과 같습니다

token
------------------------------------------------
1
2
3
4
5
6
7
8
9
0

(10 row(s) affected)
Posted by trust
,
숫자함수

ABS
ABS함수는 절대값을 나타낸다.
형식: ABS(숫자값)

POWER
POWER함수는 제곱근을 표현해 준다.
형식: POWER(숫자값, 승수값)

SQRT
SQRT는 루트값을 표현해준다.
형식: SQRT(숫자값)

RAND
RAND는 0 에서 1사이의 난수를 발생시킨다.
형식: RAND(초기값)

ROUND
ROUND는 반올림 함수이다.
형식: ROUND(숫자, 자릿수)
ROUND는 자릿수만 조심하면 된다. 2번째 결과는 8을 반올림하여 그 앞의 9에 1이 더해진것이고 3번째 결과는 9가 반올림된것이다.

CEILING, FLOOR
CEILING은 소수점 첫번째 값을 기준으로 올림을 하고 FLOOR는 소수점 첫번째 값을 기준으로 내림을 한다.
형식: CEILING(숫자) ... FLOOR도 동일
CEILING과 FLOOR는 소수 첫번째값이 5 이상이든 이하든간에 무조건 올림, 내림을 수행한다.

----------------------------------------------------------
문자함수

LEFT, RIGHT
LEFT는 지정해준 자릿수만큼 왼쪽에서부터 문자열을 반환한다.
당연히 RIGHT는 반대이다.
형식 : LEFT(문자, 자릿수)

LTRIM, RTRIM
LTRIM은 문자열의 왼쪽 공백을 제거한다. 역시 RTRIM은 반대일 경우 사용된다.
형식: LTRIM(문자)

LEN
LEN함수는 문자열에서 문자의 갯수를 추출한다.
형식: LEN(문자)
Len함수는 문자 뒤쪽의 공백은 문자로 계산하지 않는다.

UPPER, LOWER
UPPER는 소문자를 대문자로, LOWER는 대문자를 소문자로 바꾼다.
형식: UPPER(문자)

REVERSE
REVERSE는 문자열을 반대로 표시한다.
형식: REVERSE(문자열)

REPLACE
REPLACE함수는 지정한 문자열을 다른 문자열로 바꾸어준다.
형식: REPLACE(문자, 타겟문자, 바꿀문자)

REPLICATE
REPLICATE함수는 문자열을 지정된 횟수만큼 반복한다.
형식: REPLICATE(문자, 횟수)

STUFF
STUFF함수는 문자열에서 특정 시작위치에서 지정된 길이만큼 문자를 바꾸어준다.
형식: STUFF(문자, 시작위치, 길이, 바꿀문자)

SUBSTRING
SUBSTRING은 STUFF와 비슷하지만 문자를 바꾸는 것이 아니라 그 문자를 반환한다.
형식: SUBSTRING(문자, 시작위치, 길이)

PATINDEX, CHARINDEX
PATINDEX와 CHARINDEX는 문자열에서 지정한 패턴이 시작되는 위치를 뽑아준다.
형식: PATINDEX(문자패턴, 문자) - 문자패턴은 Like 사용과 같다.
형식: CHARINDEX(문자패턴, 문자) - 문자패턴은 일반형식을 사용한다.

SPACE
SPACE함수는 지정한 수 만큼 공백을 추가한다.
형식: SPACE(횟수)

시간 및 날짜 함수
GETDATE()
GETDATE()는 현재 시간을 표시해준다.
DATEADD
DATEADD함수는 날자에 지정한 만큼을 더한다.
형식: DATEADD(날자형식, 더할 값, 날자)

DATEDIFF
DATEDIFF함수는 두 날자사이의 날자형식에 지정된 부분을 돌려준다.
형식: DATEDIFF(날자형식, 시작 날자, 끝 날자)

DATENAME
DATENAME함수는 지정한 날자의 날자형식의 이름을 돌려준다.
형식: DATENAME(날자형식, 날자)

DATEPART
DATEPART함수는 날자에서 지정한 날자형식부분만 추출해줍니다.
형식: DATEPART(날자형식, 날자)
주일은 일요일부터 1로 시작해서 토요일날 7로 끝나게 된다.

---------------------------------------------------------------------
NULL 함수
ISNULL
ISNULL은 NULL값을 대체값으로 바꾼다.
형식: ISNULL(NULL값, 대체값)

NULLIF
NULLIF함수는 두개의 표현식을 비교하여 같으면 NULL을 반환한다.
형식: NULLIF(표현식1, 표현식2)

COALESCE
COALESCE함수는 NULL이 아닌 첫번째 표현식이 반환된다.
형식: COALESCE(표현식)

GETANSINULL
GETANSINULL은 데이터베이스의 기본 NULL 상태를 표시해준다.
형식: GETANSINULL(데이터베이스 이름)


------------------------------------------------------
AVG, MAX, MIN, SUM, COUNT

MAX
최대값을 구한다.

MIN
최소값을 구한다.

SUM
값갑의 합을 구한다.

AVG
평균을 구한다.

COUNT
값의 갯수를 구한다.
Posted by trust
,
sql-server 에서는 decode는 없고요.
대신에 훨씬 기능이 뛰어난 case문을 지원하고 있습니다.
오라클도 8i 부턴가 9i부턴가 case문을 지원하는것으로 알고 있습니다.

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
Posted by trust
,

db에서 사원명을 조회하는데, 외자이름을 가진 사람과 3자리 이름을 가진 사람이 혼재할 경우,

조회결과를 복사하면 정렬이 맞지 않아 text 로 활용할때 불편할때가 있다.

오라클에서는 lpad, rpad 내장함수를 이용해 쉽게 왼쪽, 오른쪽을 공백등으로 채울수가 있는데,

mssql에서는 해당 함수가 없어

REPLICATE() 함수를 이용한 function을 만들었다.

sqler 사이트등의 답변에도 소개가 되어있으나 간과한 내용이 있어 보완하자면,

한글은 2byte 이므로 함수내에서 공백을 채울 자리수 계산할때 len() 이 아니라

datalenth() 를 이용해야 한다.

그리고, 채울문자를 char 형이 아니라 varchar 로 하여 한글과 같은 2byte 문자로도 채우기가 가능하도록 하였다.

마지막으로, 대체할 문자열이 null 이거나 공백일 경우는 '-' 문자로 임의 대체후 채워지도록 하였다.


CREATE FUNCTION dbo.FN_LPAD
(@input VARCHAR(100), @ct INT, @chr varchar(10))
RETURNS varchar(100)
AS
BEGIN
  --@ct자리수에서 @input이 모자라는 만큼 @chr로 앞에 채우기
  --샘플 : @Mon를 2자리 수로 만들고 앞에 0 붙이기
  --select dbo.FN_LPAD(@Mon, 2, '0')
  if @input = '' or @input is null begin set @input = '-'; end;
  RETURN (REPLICATE(@chr, @ct-datalength(@input))+@input)
END



CREATE FUNCTION dbo.FN_RPAD
(@input VARCHAR(100), @ct INT, @chr varchar(10))
RETURNS varchar(100)
AS
BEGIN
  --@ct자리수에서 @input이 모자라는 만큼 뒤에서 @chr로 채우기
  --샘플 : @Mon를 2자리 수로 만들고 뒤에 0 붙이기
  --select dbo.FN_LPAD(@Mon, 2, '0')
  if @input = '' or @input is null begin set @input = '-'; end;
  RETURN (@input + REPLICATE(@chr, @ct-datalength(@input)))
END


select dbo.FN_RPAD(b.deptnm,25,' ')  부서
      ,dbo.FN_RPAD(b.name,10,' ')    이름
from   damdang b
where  b.name = '홍길동'
order by 1,2


---함수생성하지 않을 경우

select  b.deptnm+REPLICATE(' ', 25-datalength(b.deptnm)) 부서
      ,b.name+REPLICATE(' ', 25-datalength(b.name)) 부서
from   damdang b
where  ( len(b.name) < 3 or b.name in ('홍길동'))
order by 1,2


Posted by trust
,