SharedIT | 묻고 답하기(AMP)

mysql 쿼리 고수님들 도와주세요~

데이터를 옮겨야 하는데 수작업으로 하려니 내용이 많아 쿼리로 작업을 진행 하려고 합니다.


text_table (현재)

aa

bb

null

text1234

null

text5678


위와 같은 형식으로 구성 되어있습니다.


bb의 값중 1234, 5678 ... 숫자로 된 값들을 aa로 옮기고 bb에서는 숫자를 삭제 하려고 합니다.


text_table (변경)

aa

bb

1234

text

5678

text


쿼리 고수님들 도움 부탁 드립니다~




답변 주신 모든분들 감사드립니다...

천천히 적용해 보겠습니다.

Tags : 태그가 없습니다.

8개의 답변이 있습니다.

wansoo
  0 추천 | 4년 이상 전

실제해 보면 이렇게 되어요~ ^^

실행 결과도 캡춰해서 올려 드려 봅니다.

관리자 | 4년 이상 전

wansoo님 감사합니다~ 테스트 해보기 전에 테이블 내용을 좀 봤더니 다른 패턴의 내용들이 있어서 적용은 해보지 못했습니다~ ㅠ_ㅠ 테스트 까지 해주시고 정말 고맙습니다~~
wansoo
  0 추천 | 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년 이상 전

update 문에 의해 원본인 bb 값에 변형이 가해 지는 형식이 되어 버리기 때문에, update 문을 반복 수행할 경우에는 일부 data 손실이 생길 수 있어 주의가 필요하겠습니다. 가급적 bb 필드의 원본 값은 그대로 보존하고 cc 같은 새로운 필드에 추출한 값을 저장하는 형식으로 진행하는 것이 안전할 것이라는 첨언도 드려 봅니다.
차바라기
  0 추천 | 4년 이상 전

구글링해보니 위에 답글을 남겨주신분들처럼 하면 된다고 하는데 쉽게 되지가 않네요

wansoo | 4년 이상 전

mysql에 regexp_replace () 함수가 기본 내장되어 있지 않는 것 같네요. function을 생성해 준 후에 사용해 보니 잘 되는 것 같네요.
wansoo
  0 추천 | 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년 이상 전

varchar()

wansoo | 4년 이상 전

varchar()을 입력하면 블락되네요.

wansoo | 4년 이상 전

댓글로 등록시킬땐 어쩔땐 되는데, 또 어쩔땐 블락되고...?? 붙여서 varcha r() 입력할땐 블락되고, varchar에 빈칸을 하나 넣고 ()을 넣으면 등록되고??

wansoo | 4년 이상 전

varchar 뿐만 아니라 substrin g()도 그렇고...

wansoo | 4년 이상 전

concat도 그렇고... 이상하게 느껴지는 건, 다른 글 없이 concat () -빈칸없이-만 넣고 글 적을땐 괜찮은거 같은데, 다른 글을 넣어 길게 적으면 블락되는것 같고...

wansoo | 4년 이상 전

글 한번 입력하는데 무수한 Test를 해 보면서 등록해 봅니다. 그리고, 댓글 적다가 블락되었을 경우에는 댓글 작성을 다시 하려고 하면 앞에 입력했던 내용들이 그대로 남아 있는데, 답글 적기에서는 블락되었을 경우에 앞에 입력했던 내용들이 모두 사라져 버리게 되고요~
양성환
  0 추천 | 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 의 조합 형태로 취하면 됩니다.

빨간신발
  0 추천 | 4년 이상 전

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년 이상 전

잘안되네요 ㅎ 좀더 연구해 보겠습니다~
wansoo
  0 추천 | 4년 이상 전

update text_table set aa=regexp_replace(bb, '[a-zA-Z]',''), bb=regexp_replace(bb,'[0-9]','');

와 같이 쿼리를 주면 되지 않을까 싶네요~

관리자 | 4년 이상 전

답변 감사합니다~ 내맘 같지 않네요 ㅎㅎ 잘안되서 좀 더 열심히 검색해 봐야겠습니다~~
빨간신발
  0 추천 | 4년 이상 전

댓글에 sql이 올라가니 드롭되서 등록이 안되네요...

https://genius0527.tistory.com/39

방치된 블로그에 올렸봤습니다.