database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40644 게시물 읽기
No. 40644
오라클 순번에 관한 질문
작성자
정재영(copine)
작성일
2014-12-11 14:17ⓒ
2014-12-11 14:48ⓜ
조회수
8,038

안녕하세요. 테이블 항목중에 아래와 같은 항목이 있을경우 연속 번호인 경우는 -로 표시하고 싶습니다.

즉 아래에 예의 경우 1-4, 6-8, 10    이런식으로 sql 구문으로 가능할까요 ?

고수님들의 답변 부탁드립니다.

 

ex)

컬럼 A

1,2,3,4, 6,7,8,10

 

이 글에 대한 댓글이 총 4건 있습니다.

질문의 '1,2,3,4,6,7,8,10' 이
 - 하나의 문자열인가요?
 - 8 개의 레코드인가요?
결과의 '1-4, 6-8, 10' 이
 - 하나의 문자열인가요?
 - 3 개의 레코드인가요?

마농(manon94)님이 2014-12-11 16:14에 작성한 댓글입니다.

lead(), lag() 함수 이용하시면 될 듯 하네요

대충 뭐 이런식이겠네요. 찾아보면 방법은 많이 있을겁니다. 적당히 응용하심..

with t as ( select '1,2,3,4,6,7,8,10' p from dual )
select trim(replace(replace(wm_concat(p||x),',',''),'.',','))
from (
select p
, case when p+1 = lead(p) over(partition by 1 order by p) and p-1 = lag(p) over(partition by 1 order by p) then 'x'
       when p+1 = lead(p) over(partition by 1 order by p) then '-'
       when lead(p) over(partition by 1 order by p) is null then ' '
       else '.' end as x
from (
select to_number(
 case when level = 1 then substr(p, 1,instr(p,',',1,level)-1)
      when level = length(p) - length(replace(p,',','')) + 1 then substr(p, instr(p,',',-1)+1)
      else substr(p, instr(p,',',1,level-1)+1, instr(p,',',1,level-1+1) - instr(p,',',1,level-1)-1)
  end) as p
from t
connect by level <= length(p) - length(replace(p,',','')) + 1
)
)
where x <> 'x'
 

최성준(junkk)님이 2014-12-12 15:26에 작성한 댓글입니다.
이 댓글은 2014-12-12 15:27에 마지막으로 수정되었습니다.

마농닝 아래 부분은 하나의 컬럼 하나의 문자열로 생각하시면 됩니다.

감사합니다.

질문의 '1,2,3,4,6,7,8,10' 이
- 하나의 문자열인가요?
- 8 개의 레코드인가요?
결과의 '1-4, 6-8, 10' 이
- 하나의 문자열인가요?
- 3 개의 레코드인가요?

정재영(copine)님이 2014-12-15 09:24에 작성한 댓글입니다.

SELECT LISTAGG( MIN(x) || DECODE(COUNT(*), 1, '', '-'||MAX(x)), ', ' )
       WITHIN GROUP (ORDER BY MAX(x)) Result
  FROM (
        SELECT lv
             , TO_NUMBER(REGEXP_SUBSTR(v, '[^, ]+', 1, lv)) x
          FROM (SELECT '1,2,3,4, 6,7,8,10' v FROM dual)
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
         WHERE lv <= REGEXP_COUNT(v, ',') + 1
        )
 GROUP BY x - lv
;

마농(manon94)님이 2014-12-15 15:31에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40648이런 sort가능할까요..? [3]
한상원
2014-12-12
6426
40647오라클 클라이언트 8.1.7 구합니다 [1]
오디세이
2014-12-12
6377
40646레코드 순서대로 금액 차감을 어떻게 해야 할지??? [2]
김영하
2014-12-11
6905
40644오라클 순번에 관한 질문 [4]
정재영
2014-12-11
8038
40643VBscript로 Oracle DB 연동시 한글 깨짐 문제 해결 요청 ㅠㅠ
김병근
2014-12-10
11902
40642순위를 메기려합니다. [1]
김진수
2014-12-10
6294
40641안녕하세요 오라클 쿼리에 대해 질문 드립니다. [2]
투루로맨스
2014-12-10
6280
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다