데이터를 옮겨야 하는데 수작업으로 하려니 내용이 많아 쿼리로 작업을 진행 하려고 합니다.
text_table (현재)
aa |
bb |
null |
text1234 |
null |
text5678 |
위와 같은 형식으로 구성 되어있습니다.
bb의 값중 1234, 5678 ... 숫자로 된 값들을 aa로 옮기고 bb에서는 숫자를 삭제 하려고 합니다.
text_table (변경)
aa |
bb |
1234 |
text |
5678 |
text |
쿼리 고수님들 도움 부탁 드립니다~
답변 주신 모든분들 감사드립니다...
천천히 적용해 보겠습니다. ☺
2019-07-26(금) 14:08:18에 작성 되었습니다. 2019-07-26(금) 18:25:38에 수정 되었습니다
본문 내용이 처음 작성된 내용과 다를 수 있습니다.
본문 내용이 처음 작성된 내용과 다를 수 있습니다.
8개의 답변이 있습니다.
실제해 보면 이렇게 되어요~ ^^
실행 결과도 캡춰해서 올려 드려 봅니다.
관리자 | 4년 이상 전
죄송합니다.
이제야 실제 Test 해 보고 성공했습니다.
앞에 제가 올렸던 함수로 했을 경우에 모든 문자가 Null로 변해 버리는 문제가 있었습니다.
제대로 Test도 해 보지 않고 글을 올려서 혼돈을 드렸던거 같네요.
아래 함수 생성 명령에서 { 를 (로 모두 바꾸시고, }를 )로 모두 바꾸신 후에 복붙해서 실행시키시고요.
DELIMITER //
DROP FUNCTION IF EXISTS regexp_replace//
CREATE FUNCTION regexp_replace{original VARCHAR{1000},pattern VARCHAR{1000},replacement VARCHAR{1000}}
RETURNS VARCHAR{1000}
DETERMINISTIC
BEGIN
DECLARE temp VARCHAR{1000};
DECLARE ch VARCHAR{1};
DECLARE i INT;
SET i = 1;
SET temp = '';
IF original REGEXP pattern THEN
loop_label: LOOP
IF i > CHAR_LENGTH{original} THEN
LEAVE loop_label;
END IF;
SET ch = SUBSTRING{original,i,1};
IF NOT ch REGEXP pattern THEN
SET temp = CONCAT{temp,ch};
ELSE
SET temp = CONCAT{temp,replacement};
END IF;
SET i=i+1;
END LOOP;
ELSE
SET temp = original;
END IF;
RETURN temp;
END//
DELIMITER ;
그리고 아래 query를 실행 시키면 되겠습니다.
update text_table set aa = regexp_replace(bb, '[a-zA-Z]',''), bb = regexp_replace(bb,'[0-9]','');
앞의 답글에서 set 명령에서 = 앞뒤를 붙여 작성했는데, = 앞뒤에 빈칸이 있어야만 제대로 작동할 수 있고요.
wansoo | 4년 이상 전
구글링해보니 위에 답글을 남겨주신분들처럼 하면 된다고 하는데 쉽게 되지가 않네요
wansoo | 4년 이상 전
아래 함수 생성 명령으로 regexp_replace 함수를 생성한 후에
update text_table set aa=regexp_replace(bb, '[a-zA-Z]',''), bb=regexp_replace(bb,'[0-9]','');
를 사용해 보세요.
=================================
DELIMITER $$
CREATE FUNCTION `regexp_replace`(pattern VARCHAR (1000),replacement VARCHAR (1000),original VARCHAR (1000))
RETURNS VARCHAR (1000)
DETERMINISTIC
BEGIN
DECLARE temp VARCHAR (1000);
DECLARE ch VARCHAR (1);
DECLARE i INT;
SET i = 1;
SET temp = '';
IF original REGEXP pattern THEN
loop_label: LOOP
IF i>CHAR_LENGTH (original) THEN
LEAVE loop_label;
END IF;
SET ch = SUBSTRING (original,i,1);
IF NOT ch REGEXP pattern THEN
SET temp = CONCAT (temp,ch);
ELSE
SET temp = CONCAT (temp,replacement);
END IF;
SET i=i+1;
END LOOP;
ELSE
SET temp = original;
END IF;
RETURN temp;
END$$
DELIMITER ;
wansoo | 4년 이상 전
wansoo | 4년 이상 전
wansoo | 4년 이상 전
wansoo | 4년 이상 전
wansoo | 4년 이상 전
wansoo | 4년 이상 전
https://bizadmin.tistory.com/entry/%EB%AC%B8%EC%9E%90%EC%97%B4-%ED%95%A8%EC%88%98
문자열 함수를 이용하시면 됩니다..
규칙이 명확하면 SUBSTING 으로 가능
아니면 LEFT 와 RIGHT 조합 또는 LPAD 와 RPAD 의 조합 형태로 취하면 됩니다.
mysql이였네요...
1. 한글제거
- SELECT REGEXP_REPLACE('ab12cd한글(테스트)','[가-힣]','') AS remove_digits;
2. 숫자제거
- SELECT REGEXP_REPLACE('ab12cd한글(테스트)','[0-9]','') AS remove_digits;
3. 영문제거
- SELECT REGEXP_REPLACE('ab12cd한글(테스트)','[a-z]','') AS remove_digits;
4. 한글과 특수문자 ( ) 제거
- SELECT REGEXP_REPLACE('ab12cd한글(테스트)','[가-힣()]','') AS remove_digits;
출처: https://intro0517.tistory.com/171 [전디버거의 코딩이야기]
-update text_table
- set aa = REGEXP_REPLACE(REGEXP_REPLACE(bb,'[a-z]',''), [가-힣()]','')
- , bb = REGEXP_REPLACE(bb,'[0-9]','')
관리자 | 4년 이상 전
update text_table set aa=regexp_replace(bb, '[a-zA-Z]',''), bb=regexp_replace(bb,'[0-9]','');
와 같이 쿼리를 주면 되지 않을까 싶네요~
관리자 | 4년 이상 전
댓글에 sql이 올라가니 드롭되서 등록이 안되네요...
https://genius0527.tistory.com/39
방치된 블로그에 올렸봤습니다.