정렬 질문 입니다. , 영어, 숫자, 한글 , 썩인경우.. 0 1 7,154

by 유환 [Oracle 기초] [2024.09.08 20:09:20]


새 폴더.zip (2,131,583Bytes)
PDF_box.zip (1,562,230Bytes)
새 폴더.z01 (3,145,728Bytes)
새 폴더.z02 (3,145,728Bytes)
새 폴더.z03 (3,145,728Bytes)

정렬 순서 우선 순위가  널, 숫자, 영어대문자, 영어소문자, 특수기호 , 한글 순입니다.
숫자와 영어 썩여있을수 있고 모든 조합이 될수 도 있습니다.

아래와 같이 오더바이를 하면 숫자랑 영어가 썩어 있어도 숫자가 먼저 나오면 숫자가 영어보다 우선 순위로 나와서 
잘되는거 같습니다.

근대 오더바이 해야할 컬럼이 SEQ_NO1 ~ SEQ_NO6 까지 있씁니다.

CASE WHEN SEQ_NO1~ CASE WHEN SEQ_NO6까지 해야합니다.
문장은 길어지지만 최대 건수는 2천건이 넘지 않고 인덱스가 있어서 느려질거 같지 않은대 
6가지 모두 다 쓰는거 말고 더 좋은 방법이 있을가요?

찾아 보니까  아래 처럼 가상 컬럼을 테이블에 6개 만들어 주고 하는 방법도 있긴 하던대 

이건 좀 사용하기가 그렇습니다. 테이블 변경 요청도 해야 하고;;

ALTER TABLE EMPT ADD (
    SORT_ORDER1 AS (CASE 
                     WHEN SEQ_NO IS NULL THEN 0
                     WHEN REGEXP_LIKE(SEQ_NO, '^[0-9]') THEN 1
                     WHEN REGEXP_LIKE(SEQ_NO, '^[A-Z]') THEN 2
                     WHEN REGEXP_LIKE(SEQ_NO, '^[a-z]') THEN 3
                     WHEN REGEXP_LIKE(SEQ_NO, '^[^0-9A-Za-z가-힣]') THEN 4
                     WHEN REGEXP_LIKE(SEQ_NO, '^[가-힣]') THEN 5
                     ELSE 6
                   END)
);


SELECT A.*, ROWID
FROM EMPT A
ORDER BY A.SORTKEY
       , CASE WHEN SEQ_NO1 IS NULL THEN 0                          -- NULL 값
             WHEN REGEXP_LIKE(SEQ_NO1, '^[0-9]') THEN 1            -- 숫자로 시작
             WHEN REGEXP_LIKE(SEQ_NO1, '^[A-Z]') THEN 2            -- 영어 대문자로 시작
             WHEN REGEXP_LIKE(SEQ_NO1, '^[a-z]') THEN 3            -- 영어 소문자로 시작
             WHEN REGEXP_LIKE(SEQ_NO1, '^[^0-9A-Za-z가-힣]') THEN 4 -- 특수기호
             WHEN REGEXP_LIKE(SEQ_NO1, '^[가-힣]') THEN 5           -- 한글로 시작
             ELSE 6                                                -- 그 외의 경우
           END,
           SEQ_NO1 ASC

       , CASE WHEN SEQ_NO2 IS NULL THEN 0                        
             WHEN REGEXP_LIKE(SEQ_NO2, '^[0-9]') THEN 1          
             WHEN REGEXP_LIKE(SEQ_NO2, '^[A-Z]') THEN 2          
             WHEN REGEXP_LIKE(SEQ_NO2, '^[a-z]') THEN 3          
             WHEN REGEXP_LIKE(SEQ_NO2, '^[^0-9A-Za-z가-힣]') THEN 4
             WHEN REGEXP_LIKE(SEQ_NO2, '^[가-힣]') THEN 5          
             ELSE 6                                              
           END,
           SEQ_NO2 ASC


       , ............... SEQ_NO3 ,SEQ_NO4, SEQ_NO5, SEQ_NO6  .................
       

by 마농 [2024.09.09 09:26:31]
-- 굳이 정규식 안쓰고 그냥 정렬해도 될 것 같은데요?
 ORDER BY seq_no1 NULLS FIRST
        , seq_no2 NULLS FIRST
        , seq_no3 NULLS FIRST
        , seq_no4 NULLS FIRST
        , seq_no5 NULLS FIRST
        , seq_no6 NULLS FIRST
;

 

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