[퀴즈] 단어 분할하기 0 13 7,006

by 마농 계층쿼리 sys_connect_by_path [2010.03.15 09:56:21]


[퀴즈] 단어 분할하기


특정 단어가 주어지면 이를 다음과 같이 분해하는 쿼리를 작성하세요.
연속된 두자 이상의 조합입니다.
오라클클럽 ==> 오라,오라클,오라클클,오라클클럽,라클,라클클,라클클럽,클클,클클럽,클럽


SELECT *
  FROM (SELECT '오라클클럽' str FROM dual)
;


정답은 다시 올리겠습니다.


[정답보기] <=== 트리플 클릭
SELECT REPLACE(SYS_CONNECT_BY_PATH(str, '-'), '-') str
  FROM
(
SELECT LEVEL lv
    , SUBSTR(str, LEVEL, 1) str
  FROM (SELECT '오라클클럽' str FROM dual)
CONNECT BY LEVEL <= LENGTH(str)
)
 WHERE LEVEL > 1
CONNECT BY PRIOR lv = lv -1
;

by sunshiny [2010.03.15 18:11:23]
이건 억지인가요?^^;

SELECT SUBSTR(STR, 1, 2) STR1
, SUBSTR(STR, 1, 3) STR2
, SUBSTR(STR, 1, 4) STR3
, SUBSTR(STR, 1, 5) STR4
, SUBSTR(STR, 2, 2) STR5
, SUBSTR(STR, 2, 3) STR6
, SUBSTR(STR, 2, 4) STR7
, SUBSTR(STR, 3, 2) STR8
, SUBSTR(STR, 3, 3) STR9
, SUBSTR(STR, 4, 2) STR10
FROM (SELECT '오라클클럽' STR FROM DUAL)
;

WITH TMP_TABLE AS
(
SELECT '5' CODE , '오라클클럽' NAME ,'4' PARENT_CODE FROM DUAL
UNION ALL SELECT '4', '오라클클럽', '3' FROM DUAL
UNION ALL SELECT '3', '오라클클럽', '2' FROM DUAL
UNION ALL SELECT '2', '오라클클럽', '1' FROM DUAL
UNION ALL SELECT '1', '오라클클럽', '0' FROM DUAL
)
SELECT SUBSTR(MAX(SYS_CONNECT_BY_PATH (substr(NAME, 1, rownum), ' , ')), 8)
||SUBSTR(MAX(SYS_CONNECT_BY_PATH (substr(NAME, 2, rownum-1), ' , ')), 8)
||SUBSTR(MAX(SYS_CONNECT_BY_PATH (substr(NAME, 3, rownum-1), ' , ')), 8, 11)
||SUBSTR(MAX(SYS_CONNECT_BY_PATH (substr(NAME, 4, rownum-1), ' , ')), 8, 5) DATA
FROM TMP_TABLE
START WITH CODE = '5'
CONNECT BY CODE = PRIOR PARENT_CODE
;

by 선모 [2010.03.15 22:33:44]
SELECT substr(max(sys_connect_by_path(
case when level <= 4 then substr(str,0,level+1)
when level >= 5 and level <= 7 then substr(str,2,level-3)
else substr(str,trunc(level/2)-1,decode(mod(level,2),0,2,3))
end, ',')),2) result
FROM (SELECT '오라클클럽' str FROM dual)
connect by level <= length(str)*2

노가다네요.. 아직 실력이.. 마농이 항상 감사해요..

by 마농 [2010.03.15 22:44:40]
이번 문제의 결과를 표형태로 안그리고 그냥 쭈욱 나열했더니 그모양 그대로 하셨네요.
옆으로 나열하는 문제가 아니구요. 밑으로 결과가 나오면 됩니다.
풀어주신 답을 보니 '오라클클럽' 처럼 5글자 단어에만 국한된 답이네요.
주어지는 문자열의 자리수는 정해져 있지 않습니다.

by 선모 [2010.03.16 02:17:36]
아~ 다시 해봐야 겠네요.. 망할놈에 제안서.. 아직 퇴근을.. ㅋㅋㅋ

by sunshiny [2010.03.16 11:31:12]
정답 발표 기다려주세요.
조금 더하면 나올거 같아요^^;


by Ejql [2010.03.16 13:03:30]
아.. 성능을 장담못하겠심니다. ㅎㅎㅎ
select distinct substr(s1, l1, l2-l1+1 )
from (
select a.*, level l2
from (
SELECT '오라클클럽' s1, level l1 FROM dual
connect by level <= length('오라클클럽')) a
connect by level <= length(s1)
)
where l2 -l1+1 >= 2;

by sunshiny [2010.03.16 16:47:57]
에구~
조금만 더하면 될줄알았는데^^;
저는 더 많이 해야겠네요.
힌트로 주신 sys_connect_by_path 로 해보는데,
재미있는 것 같은데 만만치 않네요^^;
제 방식대로 해보고 천천히 올리겠습니다^^

by pjb [2010.03.16 18:57:40]
select str
from (
select replace(sys_connect_by_path(nm,'_'),'_','') str
from (
select level clvl
,substr(str,level,1) nm
,level-1 plvl
from (select '오라클클럽' str from dual)
connect by level < length(str) + 1 )
start with plvl = clvl - 1
connect by prior clvl = plvl)
where length(str) > 1

by 마농 [2010.03.16 19:04:55]
pjb님. 거의 정답입니다.
다만 약간 쓸모 없는 구문들이 보이네요.
필요 없는 구문들을 과감하게 정리하시면 정답에 가깝습니다.

by pjb [2010.03.16 21:54:15]
select replace(sys_connect_by_path(nm,'_'),'_','') str
from (
select level clvl
,substr(str,level,1) nm
,level-1 plvl
from (select '오라클클럽' str from dual)
connect by level < length(str) + 1)
where level > 1
start with plvl = clvl - 1
connect by prior clvl = plvl

by 마농 [2010.03.16 22:34:39]
start with 구문만 빼시면 정답입니다.

by 진 [2010.03.25 17:13:49]
SELECT SUBSTR(STR,ST,EN)
FROM (
SELECT STR, LEN,
CEIL(ROWNUM/(LEN-1)) ST,
DECODE( MOD(ROWNUM,LEN-1), 0, LEN-1, MOD(ROWNUM,LEN-1) )+1 EN
FROM (SELECT '오라클클럽' STR, LENGTH('오라클클럽') LEN FROM DUAL )
CONNECT BY ROWNUM <= (LEN-1)*(LEN-1)

)
WHERE LEN-ST+1 >= EN

흠.. 의도한게 이런건 아닐테지만 ... 어떻게 풀다보니...

by 쫑구 [2010.03.26 11:55:49]
저는 요렇게 해보았습니다

with t as(
select level num from dual
connect by level<=length('오라클클럽')
)
SELECT substr(str,t2.num,t1.num) str
FROM (SELECT '오라클클럽' str FROM dual),t t1,t t2
where t1.num!=1
and t1.num+t2.num<length('오라클클럽')+2
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입