안녕하세요.
oracle 11g R2 입니다.
현재 들어있는 데이터 중 한 컬럼만 파싱해서 나온 것중 각각 order by를 주려고자 합니다.
현 테이블에 별도 컬럼 추가해서 인덱스 달고 order by 하기에는 많은 어려움이 있어 할 수 없이
파싱해서 order by로 해야만 하는 상황입니다.
아래는 제가 작업하다 에러가 생겨 뭔가 좋은 방법이 있을 듯한데 생각이 안들어 문의를 드립니다.
문자+숫자+문자+숫자 등이 섞여있을 때 order by 입니다.
with t as (
select 100 dep1, 200 dep2, 300 dep3, 400 dep4, '서리1길 1-3' addr from dual
union all select 100 , 200 , 300 , 400 , '서리1길 1-2' from dual
union all select 100 , 200 , 300 , 400 , '156-1' from dual
union all select 100 , 200 , 300 , 400 , '서리11길 443' from dual
union all select 100 , 200 , 300 , 400 , '156-13' from dual
union all select 100 , 200 , 300 , 400 , '서리2길 2-4' from dual
union all select 100 , 200 , 300 , 400 , '156-21' from dual
union all select 100 , 200 , 300 , 400 , '서리4길 3-55' from dual
union all select 100 , 200 , 300 , 400 , '156-101' from dual
union all select 100 , 200 , 300 , 400 , '서리6길 44-6' from dual
union all select 100 , 200 , 300 , 400 , '서리5길 934-98' from dual
union all select 100 , 200 , 300 , 400 , '156' from dual
union all select 100 , 200 , 300 , 400 , '서리2길 1-356' from dual
union all select 100 , 200 , 300 , 400 , '서리1길 10-98' from dual
union all select 100 , 200 , 300 , 400 , '서리1길 1-345' from dual
union all select 100 , 200 , 300 , 400 , '봉천10길 1-98' from dual
union all select 100 , 200 , 300 , 400 , '봉천2길 1-945' from dual
union all select 100 , 200 , 300 , 400 , '봉천1길 10-10' from dual
union all select 100 , 200 , 300 , 400 , '봉천1길 1-10' from dual
union all select 100 , 200 , 300 , 400 , '1 서상로 1번지 1-10 우리길 5-2' from dual
union all select 100 , 200 , 300 , 400 , '13 서상로 94번지 1-10 우리길 5-2' from dual
union all select 100 , 200 , 300 , 400 , '1 서상로 11번지 1-10 우리길 5-2' from dual
union all select 100 , 200 , 300 , 400 , '3 서상로 94번지 1-10 우리길 5-2' from dual
union all select 100 , 200 , 300 , 400 , '1 서상로 24번지 1-10 우리길 5-2' from dual
)
select dep1, dep2, dep3, dep4, addr
from (
select dep1, dep2, dep3, dep4
,addr
,regexp_substr(addr
,'[^[:digit:]]+'
,1,1
) a01
,to_number(regexp_substr(addr
,'[[:digit:]]+'
,1,1
)) a02
,regexp_substr(addr
,'[^[:digit:]]+'
,1,2
) a03
,to_number(regexp_substr(addr
,'[[:digit:]]+'
,1,2
)) a04
,regexp_substr(addr
,'[^[:digit:]]+'
,1,3
) a05
,to_number(regexp_substr(addr
,'[[:digit:]]+'
,1,3
)) a06
,regexp_substr(addr
,'[^[:digit:]]+'
,1,4
) a07
,to_number(regexp_substr(addr
,'[[:digit:]]+'
,1,4
)) a08
from t
)
order by dep1, dep2, dep3, dep4
,a01 nulls first, a02 nulls first, a03 nulls first, a04 nulls first
,a05 nulls first, a06 nulls first, a07 nulls first, a08 nulls first
;
위의 결과는 아래와 같습니다.
DEP1 DEP2 DEP3 DEP4 ADDR
===========================================
100 200 300 400 156
100 200 300 400 1 서상로 1번지 1-10 우리길 5-2 -- 여기부터
100 200 300 400 1 서상로 11번지 1-10 우리길 5-2
100 200 300 400 1 서상로 24번지 1-10 우리길 5-2
100 200 300 400 3 서상로 94번지 1-10 우리길 5-2
100 200 300 400 13 서상로 94번지 1-10 우리길 5-2 -- 여기까지가 order by 비정상이네요.
100 200 300 400 156-1
100 200 300 400 156-13
100 200 300 400 156-21
100 200 300 400 156-101
100 200 300 400 봉천1길 1-10
100 200 300 400 봉천1길 10-10
100 200 300 400 봉천2길 1-945
100 200 300 400 봉천10길 1-98
100 200 300 400 서리1길 1-2
100 200 300 400 서리1길 1-3
100 200 300 400 서리1길 1-345
100 200 300 400 서리1길 10-98
100 200 300 400 서리2길 1-356
100 200 300 400 서리2길 2-4
100 200 300 400 서리4길 3-55
100 200 300 400 서리5길 934-98
100 200 300 400 서리6길 44-6
100 200 300 400 서리11길 443
===========================================
문자열이 "문자+숫자+문자+숫자 ..." 이런 정렬이면 위 쿼리로 잘 될듯한데
"숫자 + 문자 + 숫자 + 문자 .... " 이런 문자열이 있으면 order by 가 비정상으로 나옵니다.
뭔가 좋은 방법이 있으시면 말씀하여 주시면 감사하겠습니다.
감사합니다. |