수정) 오라클 정렬문제 해결 도움부탁드려요 0 10 962

by 계란에그 [2016.10.27 09:01:15]


 

해결감사합니다.


ORDER BY TO_NUMBER(REGEXP_SUBSTR(number_c, '[^-]+', 1, 2)) --NULLS FIRST
ORDER BY TO_NUMBER(REGEXP_SUBSTR(number_c, '[^-]+', 1, 2)) nulls first , SEQ

 

by 랑에1 [2016.10.27 09:16:00]

숫자부분을 잘라서 to_number 적용하시던지

1, 2, 3.. 을 01, 02, 03 으로 바꾸시던지

둘중에 한가지로 하시면 될 것 같네요.


by Kyle [2016.10.27 09:28:29]
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

 

하이픈 뒤에 숫자가 몇자리 까지 나올지 알수 없을 경우에는 숫자로 변환해서 처리 하시고

자리수가 정해져 있다면 문자로 처리해서 정렬 하셔도 됩니다.


by 계란에그 [2016.10.27 10:03:21]

저런 비슷한데이터가 많은경우는

-1

-1

-2

-2 이런식으로 정렬이되는데 이런경우는 어떻게 처리해야하나요?


by Kyle [2016.10.27 10:06:30]

-1

-1

-2

-2

같은 데이터의 경우 무얼 기준으로 정렬이 되어야 하나요?

수정해서 올리신 쿼리의 seq 를 기준으로 하면되나요?

order by 에 정렬 기준을 추가해 주시면 됩니다.

ORDER BY TO_NUMBER(REGEXP_SUBSTR(TXT, '[^-]+', 1, 2)) NULLS FIRST ASC, SEQ

 


by 도미노 같은 놈 [2016.10.27 10:29:58]
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 절에 넣어봤는데 실력이 부족해서 좀 지저분 하네요 정규식 사용하면 더 깔끔해질거 같기도 하구요..


by 계란에그 [2016.10.27 13:08:23]

고맙습니다. ㅎㅎ


by 마농 [2016.10.27 10:30:05]
-- 질문의 쿼리에서 문자 자르기를 잘못 하셨네요.
-- 숫자로 바꾸었다가 다시 붙이면 소용 없구요.
-- 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
;

 


by 계란에그 [2016.10.27 13:07:29]

고맙습니다.


by Kyle [2016.10.27 10:52:00]
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)

 


by 계란에그 [2016.10.27 13:06:57]

고맙습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입