정렬 순서 우선 순위가 널, 숫자, 영어대문자, 영어소문자, 특수기호 , 한글 순입니다.
숫자와 영어 썩여있을수 있고 모든 조합이 될수 도 있습니다.
아래와 같이 오더바이를 하면 숫자랑 영어가 썩어 있어도 숫자가 먼저 나오면 숫자가 영어보다 우선 순위로 나와서
잘되는거 같습니다.
근대 오더바이 해야할 컬럼이 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 .................