숫자 8자리를 문자 6자리로 변환하는 규칙을 가지는 SQL 0 7 1,411

by 월화수목금금금 [SQL Query] [2017.04.19 16:18:17]


오라클 SQL을 사용하여

13525237   이런 8자리 컬럼을

ABCDEF      이런 6자리 문자로 변환하는 규칙을 가지는 쿼리를 생성 할 수 있을까요?

특수 기호는 사용하면 않되고 특정규칙을 만들려고하니 숫자의 범위가 너무 커서 힘들거 같은데 가능 할까요?

by 미생 [2017.04.19 16:38:09]

16진수나 32진수 사용하면 되지 않을까요.


by chrome [2017.04.19 16:46:36]

요즘은 기억 안나는 해쉬알고리즘을 적용하면 되겠내요. 

 


by 마농 [2017.04.19 17:21:29]
-- 10진수를 26진수 형태로 변환한 뒤 각자리 수(0~25)를 (A~Z)로 변환
SELECT id
     , v
     , LISTAGG(
       CHR(FLOOR(MOD(v, POWER(26, lv)) / POWER(26, lv-1)) + 65)
       ) WITHIN GROUP(ORDER BY lv) x
  FROM (SELECT 1 id, 13525237 v FROM dual)
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 6)
 GROUP BY id, v
;

 


by jkson [2017.04.19 18:02:04]

프로그래머는 수학을 잘해야된다더니.. 이해가 안 되네요ㅋㅋ


by 월화수목금금금 [2017.04.19 18:39:03]

마농님 답변감사합니다~쿼리는 이해를 했는데 쿼리를 날려보니 

ORA-00923: FROM keyword not found where expected

이런에러가 나오네용~


by jkson [2017.04.19 19:32:06]
WITH T(RM, QT, LV) AS
(
SELECT MOD(:V,26) RM, FLOOR(:V/26) QT, 1 LV FROM DUAL
UNION ALL
SELECT MOD(QT,26), FLOOR(QT/26), LV + 1 FROM T
WHERE LV < 6
)
SELECT LISTAGG(CHR(RM+65)) WITHIN GROUP(ORDER BY LV) VAL 
FROM T

진수 변환 방법을 완전히 잊었네요. 산수를 못해서 그런지 마농님 쿼리는 다시 봐도 잘 이해가..;

ORA-00923 은 FROM 이 나올 자리에 다른 게 나왔다는 걸로 봐서 SELECT 절을 잘못 적으신듯..


by 마농 [2017.04.20 07:32:17]

LISTAGG 는 11G부터 사용 가능합니다.
http://www.gurubee.net/article/55512
 

SELECT id
     , v
     , CHR(FLOOR(MOD(v, POWER(26, 1)) / POWER(26, 0)) + 65)
    || CHR(FLOOR(MOD(v, POWER(26, 2)) / POWER(26, 1)) + 65)
    || CHR(FLOOR(MOD(v, POWER(26, 3)) / POWER(26, 2)) + 65)
    || CHR(FLOOR(MOD(v, POWER(26, 4)) / POWER(26, 3)) + 65)
    || CHR(FLOOR(MOD(v, POWER(26, 5)) / POWER(26, 4)) + 65)
    || CHR(FLOOR(MOD(v, POWER(26, 6)) / POWER(26, 5)) + 65)
    AS x
  FROM (SELECT 1 id, 13525237 v FROM dual)
;

 

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