제목 그대로 char 형태의 아이피를
sorting하고싶은데 어떻게 sql문을 작성
해야 할지요 일반 텍스트로 정렬을 하면 끝자리
a.b.c.2번 이 a.b.c.10번 서버보다 뒤에 오게 되서요.........
그냥 쿼리를 하기는 복잡하고, 힘들것 같습니다..
아래의 사용자 함수를 이용하시면 될 것 같습니다.
그리고 아래의 사용자 함수는 http://sqler.pe.kr에
올라와 있는 split 사용자 함수를 수정한 것 입니다..
drop function dbo.fn_sortStr
go
CREATE FUNCTION dbo.fn_sortStr(@sText varchar(8000),@fill_num int, @sDelim varchar(20) ='#')
RETURNS varchar(8000)
AS
BEGIN
DECLARE @idx smallint,
@value varchar(8000),
@bcontinue bit,
@iStrike smallint,
@iDelimlength tinyint
,@retVal varchar(8000)
SET @idx = 1
SET @sText = LTrim(RTrim(@sText))
SET @iDelimlength = LEN(@sDelim)
SET @bcontinue = 1
set @retVal = ''
WHILE @bcontinue = 1
--텍스트에서 구분자를 발견하면, 첫 번째 요소를 반환하고
--반환되는 테이블에 인덱스를 입력한다.
IF CHARINDEX(@sDelim, @sText)>0
-- 첫 번째 요소를 반환
SET @value = SUBSTRING(@sText,1, CHARINDEX(@sDelim,@sText)-1)
-- 마지막 값도 구분자로 나누어져 있으뎐
SET @retVal = @retVal+ right( REPLICATE('0',@fill_num)+ @value ,@fill_num)
--다음 요소와 구분자를 문자열의 앞에서부터 제거하고,
--index를 증가시키고 반복작업(loop)을 이어간다.
SET @iStrike = LEN(@value) + @iDelimlength
SET @idx = @idx + 1
SET @sText = LTrim(Right(@sText,LEN(@sText) - @iStrike))
END
ELSE
--만약 텍스트 안에서 구분자를 더 이상 찾을 수 없게 되면,
--@sText가 @retArray의 마지막 값이다.
SET @value = @sText
-- 문자열 정렬를 위해 자리수를 마춤
--WHILE 루프를 빠져 나온다.
SET @bcontinue = 0
RETURN @retVal
Go
* 사용 예제
create table ip
(
ip varchar(40) primary key
)
insert into ip(ip) values('201.10.5.6')
insert into ip(ip) values('31.10.5.50')
insert into ip(ip) values('100.10.10.10')
select dbo.fn_sortStr(ip,3,'.') ,*
from ip
order by dbo.fn_sortStr(ip,3,'.') desc