델마당(http://www.delmadang.com)에 올라온 글입니다.
----------------------------------------------------------------------------------------
내가 근무하는 회사의 직원 중 하나가 다음과 같은 SQL 쿼리 문제를 제기했다.
1. Customer라는 테이블에 cust_name라는 필드가 있다. 이 필드는 유니코드가 아닌 일반 문자열(varchar) 타입이다.
2. cust_name필드에는 거래처명이 입력되어 있는데, 이 거래처명이 ㄱ, ㄴ, ㄷ 등 각 초성으로 시작하는 거래처 수를 알고 싶다. 예를 들어 김말동은 'ㄱ' 범위이고 '홍길동'은 'ㅎ' 범위에 해당된다.
3. 각각의 한글 초성에 해당하는 거래처 이름 수를 표시하는, 다음과 같은 결과를 쿼리를 작성해야 한다.
ㄱ 2324 -- 기역 범위 거래처 수
ㄴ 213 -- 니은 범위 거래처 수
ㄷ 1123
...
ㅎ 423
기타 3434
4. 순수 SQL 쿼리문으로 풀어야한다는 전제조건이 있다. 즉 일반 컴 언어(비베나 델파이같은)를 동원하여 파싱이나, 잘라내기를 하면 안된다는 것이다.
쉬울거 같으면서 만만치 않은 문제여서 여러분들과 함께 풀어보고자 한다.
----------------------------------------------------------------------------------------
가장 마음에(?) 드는 답변은 아래와 같다.
단계 1. 중복구문을 제거하기 위해 사용자 정의 함수를 추가한다.
CREATE FUNCTION [ChrCount] (@StartChr varChar(10), @EndChr varChar(10))
RETURNS int AS
BEGIN
declare @ReturnValue int
set @ReturnValue = (select count(custom_name) from test_sort
where custom_name >= @StartChr and custom_name < @EndChr)
return @ReturnValue
END
[이함수가 두 인자값을 받아서 실질적인 카운터를 한다.]
단계 2. SQL 쿼리 문을 작성한다.
select 'ㄱ', dbo.ChrCount('ㄱ', 'ㄴ')
, 'ㄴ', dbo.ChrCount('ㄴ', 'ㄷ')
, 'ㄷ', dbo.ChrCount('ㄷ', 'ㄹ')
, 'ㄹ', dbo.ChrCount('ㄹ', 'ㅁ')
, 'ㅁ', dbo.ChrCount('ㅁ', 'ㅂ')
, 'ㅂ', dbo.ChrCount('ㅂ', 'ㅅ')
, 'ㅅ', dbo.ChrCount('ㅅ', 'ㅇ')
, 'ㅇ', dbo.ChrCount('ㅇ', 'ㅈ')
, 'ㅈ', dbo.ChrCount('ㅈ', 'ㅊ')
, 'ㅊ', dbo.ChrCount('ㅊ', 'ㅋ')
, 'ㅋ', dbo.ChrCount('ㅋ', 'ㅌ')
, 'ㅌ', dbo.ChrCount('ㅌ', 'ㅍ')
, 'ㅍ', dbo.ChrCount('ㅍ', 'ㅎ')
, 'ㅎ', dbo.ChrCount('ㅎ', 'ㅎ???')
, 'a~z', dbo.ChrCount('a', 'z')
- 사용자 함수를 사용하면 요로코롬 이쁘게 쿼리문을 사용할수 있다.
- 사용자 함수는 SQL쿼리 문에서 호출할경우 DBUser명을 붙여서 호출하여야한다.
(반환값을 테이블 형식으로도 쓸수있다.)
장점)
1. SQL쿼리문을 이쁘게 만들수있다. (*^^*)
2. 남들이 안쓰는거쓰니 뽀대난다.( 주위에 이미 다들쓰고 있다면 대략 OTL)
3. 속도가 무진쟝 빠르다.. 일반 쿼리문 sp_procedure, view_Table 기타등등
어떤넘보다 속도가 빠르다..일반적인 모든 select 구문을 테이블 반환형의
사용자 함수로 대치가능하다..속도도 당근 무쟈게 빠르다..
.............그런데...왜 빠른지는 몰것다는점...
'Dev... > 플밍 관련 자료' 카테고리의 다른 글
[펌] [java성능] 5.IO Streams.doc (0) | 2005.02.11 |
---|---|
[펌] Java Garbage Collection에 대한 소개와 메모리 Tuning을 통한 성능향상 (0) | 2005.01.07 |
[펌] 드디어 mono 베타1이 릴리즈되었습니다. (2) | 2004.05.06 |
경악스러운 FPS게임입니다.. 아~~~ (0) | 2004.04.27 |
예전 인트라빌더.. 잡지에 소개할때 사용한 문서 (0) | 2004.04.27 |