* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
|
Window7 32bit, Linux 64bit 등 |
|
[cubrid_rel] 수행 결과 |
|
[도움말]-[버전정보] 확인 |
|
java, php, odbc 등 입력 |
* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
에러 내용 및 재현 방법 | 재현 가능한 Source와 SQL |
관련 테이블(인덱스, 키정보 포함) 정보 | CUBRID 홈 디렉토리 아래 log 디렉토리 압축 |
-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
https://www.cubrid.com/qna/3832313
여기에 질문 올렸는데 어떤식의 정렬을 원하는지 적질 않아서 다시 한 번 질문합니다.
1. 테스트 (test 1.2.3)
2. 테스트
3. 테스트
10. 테스트 (test 2ver)
테스트-1
테스트-2
테스트 1978-1999
테스트 1999-2000
이러한 데이터가 있을 때 , 그냥 말씀 그대로 저 위와 같이 데이터가 정렬되었으면 합니다.
말씀하신대로 단순히 title asc 로 작업하면
1. 테스트 (test 1.2.3)
10. 테스트 (test 2ver) <--- 여기가 잘못됨
2. 테스트
3. 테스트
테스트 1978-1999
테스트 1999-2000
테스트-1
테스트-2
이런식으로 정렬되는데
숫자 1 다음에 10이 아니라 2가 오면 좋겠습니다.
title이라는 컬럼의 데이터가 문자+숫자 혼합형인 경우의 정렬에 관한 문의로 이해됩니다.
DB에서 알아서 문자+숫자데이터를 확인하여 정렬해 주는 함수는 제공 되지 않습니다.
1) 데이터가 숫자인 경우 : TO_NUMBER(), cast()변환 함수를 사용하여 치환 정렬하는 방법
2) 데이터가 숫자+문자인 경우 : order by LPAD(char, 10) asc 를 사용하여 '0'덧붙여서 가공하여 정렬하는 방법
또는 length()함수를 이용하여 문자열 길이를 가지고 정렬할 수 도 있으나 작성자님이 원하시는 정렬 아래와 같은 쿼리 형태로 가능할 것 같습니다.
create table ttdb(title varchar(20));
insert into ttdb values('1. 테스트 (test 1.2.3)');
insert into ttdb values('2. 테스트');
insert into ttdb values('3. 테스트');
insert into ttdb values('10. 테스트 (test 2ver)');
insert into ttdb values('테스트-1');
insert into ttdb values('테스트-2');
insert into ttdb values('테스트 1978-1999');
insert into ttdb values('테스트 1999-2000');
select *
from ttdb
ORDER BY
CASE WHEN UPPER(SUBSTR(title,1,1)) BETWEEN 'A' AND 'Z' THEN 1
WHEN SUBSTR(title,1,1) BETWEEN '0' AND '9' THEN 2 ELSE 9 END asc
=== <Result of SELECT Command in Line 5> ===
title
======================
'1. 테스트 (test 1.2.3)'
'2. 테스트'
'3. 테스트'
'10. 테스트 (test 2ver)'
'테스트-1'
'테스트-2'
'테스트 1978-1999'
'테스트 1999-2000'
8 rows selected. (0.002751 sec) Committed.
더 나은 방법이 있을 수 있겠으나 우선 답변 드립니다.
실업무에서는 되도록이면 order-colume생성하여 처리하시는것이 좋을 듯합니다.
감사합니다.