WITH T(TXT) AS ( SELECT '2100265495_000030' FROM DUAL UNION ALL SELECT '2100265495_000030-1' FROM DUAL UNION ALL SELECT '2100265495_000030-10' FROM DUAL UNION ALL SELECT '2100265495_000030-11' FROM DUAL UNION ALL SELECT '2100265495_000030-12' FROM DUAL UNION ALL SELECT '2100265495_000030-2' FROM DUAL UNION ALL SELECT '2100265495_000030-3' FROM DUAL UNION ALL SELECT '2100265495_000030-4' FROM DUAL UNION ALL SELECT '2100265495_000030-5' FROM DUAL UNION ALL SELECT '2100265495_000030-6' FROM DUAL UNION ALL SELECT '2100265495_000030-7' FROM DUAL UNION ALL SELECT '2100265495_000030-8' FROM DUAL UNION ALL SELECT '2100265495_000030-9' FROM DUAL ) SELECT T.*, LPAD(REGEXP_SUBSTR(TXT, '[^-]+', 1, 2), 3, '0'), TO_NUMBER(REGEXP_SUBSTR(TXT, '[^-]+', 1, 2)) FROM T ORDER BY TO_NUMBER(REGEXP_SUBSTR(TXT, '[^-]+', 1, 2)) NULLS FIRST --ORDER BY LPAD(REGEXP_SUBSTR(TXT, '[^-]+', 1, 2), 3, '0') NULLS FIRST
하이픈 뒤에 숫자가 몇자리 까지 나올지 알수 없을 경우에는 숫자로 변환해서 처리 하시고
자리수가 정해져 있다면 문자로 처리해서 정렬 하셔도 됩니다.
select substr(number_c,1,17)||to_number(substr(number_c,18,19)) number_c, cnt ,seq from( select '2100265495_000030' number_c, '13' cnt, '1' seq from dual union select '2100265495_000030-1' number_c, '13' cnt, '2' seq from dual union select '2100265495_000030-2' number_c, '13' cnt, '3' seq from dual union select '2100265495_000030-3' number_c, '13' cnt, '4' seq from dual union select '2100265495_000030-4'number_c , '13' cnt, '5' seq from dual union select '2100265495_000030-5'number_c , '13' cnt, '6' seq from dual union select '2100265495_000030-6' number_c, '13' cnt, '7' seq from dual union select '2100265495_000030-7'number_c , '13' cnt, '8' seq from dual union select '2100265495_000030-8' number_c, '13' cnt, '9' seq from dual union select '2100265495_000030-9' number_c, '13' cnt, '10' seq from dual union select '2100265495_000030-10' number_c, '13' cnt, '11' seq from dual union select '2100265495_000030-11' number_c, '13' cnt, '12' seq from dual union select '2100265495_000030-12' number_c, '13' cnt, '13' seq from dual ) order by substr(number_c, 1, instr(number_c, '_')-1), case when instr(number_c, '-') = 0 then substr(number_c, instr(number_c, '_')+1) else substr(number_c, instr(number_c, '_')+1, instr(substr(number_c, instr(number_c, '_')+1), '-')-1) end, case when instr(number_c, '-') = 0 then 0 else to_number(substr(number_c, instr(number_c, '-')+1)) end;
저는 '_' 와 '-' 기준으로 3개의 값으로 분할해서 각각 order by 절에 넣어봤는데 실력이 부족해서 좀 지저분 하네요 정규식 사용하면 더 깔끔해질거 같기도 하구요..
-- 질문의 쿼리에서 문자 자르기를 잘못 하셨네요. -- 숫자로 바꾸었다가 다시 붙이면 소용 없구요. -- 1. 앞자리 17자 고정인 경우 -- SELECT number_c , SUBSTR(number_c, 1, 17) x , TO_NUMBER(SUBSTR(number_c, 19)) y FROM t ORDER BY x, y NULLS FIRST ; -- 2. 앞자리 도 가변 길이인 경우 SELECT number_c , SUBSTR(number_c, 1, INSTR(number_c||'-', '-') - 1) x , TO_NUMBER(SUBSTR(number_c, INSTR(number_c||'-', '-') + 1)) y FROM t ORDER BY x, y NULLS FIRST ;
SELECT --substr(number_c,1,17), NUMBER_C, LPAD(REGEXP_SUBSTR(NUMBER_C, '[^-]+', 1, 2), 2, '0') A, TO_NUMBER(REGEXP_SUBSTR(NUMBER_C, '[^-]+', 1, 2)) B, CNT ,SEQ FROM( SELECT '2100265495_000030' NUMBER_C, '13' CNT, '1' SEQ FROM DUAL UNION SELECT '2100265495_000030-1' NUMBER_C, '13' CNT, '2' SEQ FROM DUAL UNION SELECT '2100265495_000030-2' NUMBER_C, '13' CNT, '3' SEQ FROM DUAL UNION SELECT '2100265495_000030-3' NUMBER_C, '13' CNT, '4' SEQ FROM DUAL UNION SELECT '2100265495_000030-4'nUMBER_C , '13' CNT, '5' SEQ FROM DUAL UNION SELECT '2100265495_000030-5'nUMBER_C , '13' CNT, '6' SEQ FROM DUAL UNION SELECT '2100265495_000030-6' NUMBER_C, '13' CNT, '7' SEQ FROM DUAL UNION SELECT '2100265495_000030-7'nUMBER_C , '13' CNT, '8' SEQ FROM DUAL UNION SELECT '2100265495_000030-8' NUMBER_C, '13' CNT, '9' SEQ FROM DUAL UNION SELECT '2100265495_000030-9' NUMBER_C, '13' CNT, '10' SEQ FROM DUAL UNION SELECT '2100265495_000030-10' NUMBER_C, '13' CNT, '11' SEQ FROM DUAL UNION SELECT '2100265495_000030-11' NUMBER_C, '13' CNT, '12' SEQ FROM DUAL UNION SELECT '2100265495_000030-12' NUMBER_C, '13' CNT, '13' SEQ FROM DUAL UNION SELECT '2100265495_000031' NUMBER_C, '13' CNT, '1' SEQ FROM DUAL UNION SELECT '2100265495_000031-1' NUMBER_C, '13' CNT, '2' SEQ FROM DUAL UNION SELECT '2100265495_000031-2' NUMBER_C, '13' CNT, '3' SEQ FROM DUAL UNION SELECT '2100265495_000031-3' NUMBER_C, '13' CNT, '4' SEQ FROM DUAL UNION SELECT '2100265495_000031-4'nUMBER_C , '13' CNT, '5' SEQ FROM DUAL UNION SELECT '2100265495_000031-5'nUMBER_C , '13' CNT, '6' SEQ FROM DUAL UNION SELECT '2100265495_000031-6' NUMBER_C, '13' CNT, '7' SEQ FROM DUAL UNION SELECT '2100265495_000031-7'nUMBER_C , '13' CNT, '8' SEQ FROM DUAL UNION SELECT '2100265495_000031-8' NUMBER_C, '13' CNT, '9' SEQ FROM DUAL UNION SELECT '2100265495_000031-9' NUMBER_C, '13' CNT, '10' SEQ FROM DUAL UNION SELECT '2100265495_000031-10' NUMBER_C, '13' CNT, '11' SEQ FROM DUAL UNION SELECT '2100265495_000031-11' NUMBER_C, '13' CNT, '12' SEQ FROM DUAL UNION SELECT '2100265495_000031-12' NUMBER_C, '13' CNT, '13' SEQ FROM DUAL ) ORDER BY REGEXP_SUBSTR(NUMBER_C, '[^-]+', 1, 1), NVL(TO_NUMBER(REGEXP_SUBSTR(NUMBER_C, '[^-]+', 1, 2)), 0)