쿼리 질문입니다. 1 12 1,121

by 라슈 [PL/SQL] [2013.08.23 12:58:43]


예를 들어 A라는 컬럼에 300개의 문자가 들어있고

이것을 어떨 때는 1번째위치의 1문자와  3번째 위치의 1문자를 끈어서 합쳐 쓰고
어떨때는 100번째 위치의 1문자와 90번째 위치의 1문자와  32번째 위치의 1문자를 끈어서 합쳐서 쓰고 싶습니다.


이것을 함수로 만들어 사용할려고 하는데  어떻게 해야할까요??

문제는 끈어쓰는 위치와 개수가 가변적이라는 점 입니다.

고수님들 답변 부탁드립니다.
by 우리집아찌 [2013.08.23 13:10:42]

위치 정보는 컬럼에 보관하나요? 아니면 파라미터로?

by 라슈 [2013.08.23 13:14:10]

파라메터 입니다.


by 아린 [2013.08.23 13:19:08]
문자는 1문자만 끊어서 사용하나요?

by 라슈 [2013.08.23 13:29:53]
한문자만 사용합니다.

by 우리집아찌 [2013.08.23 13:26:38]

문자길이 이상의 파라미터값이 오면요?

by 라슈 [2013.08.23 13:30:56]

문자길이 이상의 파라메타는 오지 않는다는 가정 입니다. 


by 아발란체 [2013.08.23 13:27:08]
 
--함수 만들기
CREATE OR REPLACE FUNCTION GET_CC(text IN VARCHAR2, idx IN VARCHAR2, len IN INTEGER)
RETURN VARCHAR2
IS 
 RESULT VARCHAR2(100);
BEGIN
 SELECT SUBSTR(text, idx, len) INTO RESULT FROM DUAL;
RETURN RESULT;
END;

--사용
WITH T AS (
 SELECT 'A1B2C3D4E5F6G7H8I9J10K11L12M13N14O15P16Q17R18S19T20U21V22W23X24Y25Z26' AS text FROM DUAL
)
SELECT
 GET_CC(text, 5, 1) || --5번째 위치 문자 1개
 GET_CC(text, 23, 1) || --23번째 위치 문자 1개
 GET_CC(text, 52, 1) || --52번째 위치 문자 1개
 GET_CC(text, 62, 3) --62번째 위치 문자 3개
FROM
 T

by 라슈 [2013.08.23 13:35:26]
답변 감사합니다.
제가 하고 싶은 것은 리턴값으로  이미 끈어서 만들어진 문자를 받고 싶습니다.

by 아린 [2013.08.23 13:31:43]
WITH t(str) AS(
SELECT 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' FROM dual
)
-- p_val  =>  '1,3,5'  코마(,)로 구분해서 위치문자입력 
SELECT LISTAGG(SUBSTR(str, REGEXP_SUBSTR(val, '[^,]+', 1, lv), 1)) 
       WITHIN GROUP(ORDER BY lv) val
  FROM t
     , (SELECT LEVEL lv, :p_val val
          FROM dual 
         CONNECT BY LEVEL <= REGEXP_COUNT(:p_val, ',') + 1 )

by 라슈 [2013.08.23 13:39:50]

좋은 쿼리 감사합니다.^^
많은 공부가 되었습니다.


by 아린 [2013.08.23 13:54:35]
함수로 필요한가 보네요.

-- 함수
CREATE OR REPLACE FUNCTION fun_a(text IN VARCHAR2, idx IN VARCHAR2)
RETURN VARCHAR2
IS
  result VARCHAR2(300);
BEGIN
  SELECT LISTAGG(SUBSTR(text, REGEXP_SUBSTR(idx, '[^,]+', 1, LEVEL), 1))
         WITHIN GROUP(ORDER BY LEVEL) INTO result
    FROM dual
   CONNECT BY LEVEL <= REGEXP_COUNT(idx, ',') + 1;
RETURN result;
END;        

-- 사용
WITH t(str) AS(
SELECT 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' FROM dual
)
SELECT fun_a(str,'1,3,6')
     , fun_a(str,'1,3,6,7,8,9')
  FROM t

by 마농 [2013.08.23 14:43:08]
-- Select 없이 순수 코딩으로...
CREATE OR REPLACE FUNCTION f_test
( i_str VARCHAR2
, i_par VARCHAR2
)
RETURN VARCHAR2
IS
  v_par VARCHAR2(4000) := i_par||',';
  v_pos NUMBER(3);
  o_str VARCHAR2(300);
BEGIN
  WHILE INSTR(v_par, ',') > 0 LOOP
    v_pos := SUBSTR(v_par, 1, INSTR(v_par, ',') - 1);
    o_str := o_str || SUBSTR(i_str, v_pos, 1);
    v_par := SUBSTR(v_par, INSTR(v_par, ',') + 1);
  END LOOP;
  RETURN o_str;
END;
/

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