mysql 함수 만드는데 질문 드립니다. 0 12 1,383

by 빅타 [MySQL] mysql function procedure plsql [2020.10.22 09:55:22]


함수를 만들어 본 경험이 얼마 없어 질문 드립니다.

 

함수명(1,2,5,4,3,6) 을 호출시 결과가 1,2,3,4,5,6으로 1row가 출력되게 하려면 어떻게 작성해야 하는지 도움 부탁드립니다 ㅜ

 

며칠째 헤매고 있네요..

 

 

by 마농 [2020.10.22 10:08:57]
-- 함수가 굳이 필요한가요?
SELECT 1, 2, 3, 4, 5, 6

 


by 빅타 [2020.10.22 10:18:04]

1,2,5,4,3,6은 예시이고

셀렉트된 결과를 함수 태워서 정렬된 결과로 바꾸려는 겁니다..

select insert 하기 전에 select된 결과를 함수 한번 태워서 순서대로 정렬 한 후 insert하려고 하거든요


by 마농 [2020.10.22 10:55:21]

아! 순서가 달랐었네요. 난 (1,2,5,4,3,6) 을 (1,2,3,4,5,6) 으로 읽어 버렸네요.

캠릿브지 대학의 연결구과에 따르면,
한 단어 안에서 글자가 어떤 순서로 배되열어 있는가 하는것은 중요하지 않고
첫째번와 마지막 글자가 올바른 위치에 있것는이 중요하다고 한다.
나머지 글들자은 완전히 엉진망창의 순서로 되어 있을지라도 당신은 아무 문없제이 이것을 읽을 수 있다.
왜하냐면 인간의 두뇌는 모든 글자를 하나하나 읽것는이 아니라 단어 하나를 전체로 인하식기 때문이다.


by 빅타 [2020.10.22 11:17:28]

아 맞어요 저도 본적이 있어요 ㅎㅎ
마농님은 모르는게 없으시군요 ^^

암튼.. 프로시저나 함수 만들기가 여간 어려운게 아니네요 ㅠㅠ


by pajama [2020.10.22 11:17:05]

임시테이블에 넣고 group_concat을 쓰면 어떨까요?


by 빅타 [2020.10.22 11:20:45]

columnA

1

2

5

4

3

6

이 아니라

columnA

1,2,5,4,3,6

하나의 varchar 입니다 ㅠ


by pajama [2020.10.22 11:51:35]

좀 조잡하긴 하지만 이것저것 참고해서 만들어봤습니다... 

https://stackoverflow.com/questions/14950466/how-to-split-the-name-string-in-mysql

https://stackoverflow.com/questions/7020001/how-to-count-items-in-comma-separated-list-mysql

 

DELIMITER $$
 
DROP FUNCTION IF EXISTS split_str$$
DROP FUNCTION IF EXISTS myfunc$$

CREATE FUNCTION SPLIT_STR(x VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), delim, '');
$$

 
CREATE FUNCTION myfunc (s1 VARCHAR(20)) RETURNS VARCHAR(20)


BEGIN
     DECLARE returnVal  VARCHAR(20);
     DECLARE nCnt       INT DEFAULT 0;

     CREATE TEMPORARY TABLE myfunc_tab (n99 int);

     WHILE (nCnt < LENGTH(s1) - LENGTH(REPLACE(s1, ',', '')) + 1 ) DO
        SET nCnt = nCnt + 1;        
        INSERT INTO myfunc_tab VALUES(split_str(s1,',',nCnt));
     END WHILE;

     SELECT group_concat(n99 order by n99) INTO returnVal FROM myfunc_tab;
     DROP TEMPORARY TABLE myfunc_tab;

     RETURN returnVal;
END $$

DELIMITER ;

MariaDB [test]> select myfunc ('1,2,5,4,3,6');
+------------------------+
| myfunc ('1,2,5,4,3,6') |
+------------------------+
| 1,2,3,4,5,6            |
+------------------------+
1 row in set (0.001 sec)

 


by 빅타 [2020.10.22 13:06:13]

잘 되네요 답변 너무너무 감사합니다!!


by 마농 [2020.10.22 12:54:42]
-- 함수 없이 그냥
SELECT GROUP_CONCAT(v ORDER BY v) v
  FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('1,2,5,4,3,6', ',', lv), ',', -1) + 0 v
          FROM (SELECT 1 lv
                UNION ALL SELECT 2
                UNION ALL SELECT 3
                UNION ALL SELECT 4
                UNION ALL SELECT 5
                UNION ALL SELECT 6
                ) a
        ) a
;

 


by 빅타 [2020.10.22 13:04:54]

1

2

5

4

3

6

이 아니라

columnA

1,2,5,4,3,6

하나의 varchar라서 UNION ALL 한 부분이 제 질문과는 맞지가 않네요 ㅠ


by 마농 [2020.10.22 13:58:00]

UNION 이 입력값에 대한 UNION 이 아닙니다.
입력값 '1,2,5,4,3,6' 은 따로 있습니다.
자세히 보세요.

-- 명확하게 구별하기 위해 입력값을 아래로 내려 봤습니다.
SELECT GROUP_CONCAT(v ORDER BY v) v          -- 출력값
  FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(v, ',', lv), ',', -1) + 0 v
          FROM (SELECT '1,2,5,4,3,6' v) a    -- 입력값
             , (SELECT 1 lv
                UNION ALL SELECT 2
                UNION ALL SELECT 3
                UNION ALL SELECT 4
                UNION ALL SELECT 5
                UNION ALL SELECT 6
                ) b
        ) c
;

 


by 마농 [2020.10.22 14:19:15]
-- 테이블 직접 조회 예시 --
WITH t AS
(
SELECT 1 idx, '1,2,5,4,3,6' v
UNION ALL SELECT 2, '11,22,5,6,3,9'
)
SELECT idx, v
     , GROUP_CONCAT(x ORDER BY x) x
  FROM (SELECT idx, v
             , SUBSTRING_INDEX(SUBSTRING_INDEX(v, ',', lv), ',', -1) + 0 x
          FROM t a
             , (SELECT 1 lv
                UNION ALL SELECT 2
                UNION ALL SELECT 3
                UNION ALL SELECT 4
                UNION ALL SELECT 5
                UNION ALL SELECT 6
                ) b
        ) c
 GROUP BY idx, v
;

 

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