mysql 컬럼 특정 태그 사이만 변경

mysql 컬럼 특정 태그 사이만 변경

QA

mysql 컬럼 특정 태그 사이만 변경

답변 2

본문

안녕하세요.

mysql에서

test라는 테이블 안에 free 라는 컬럼이 있습니다.

 

free 컬럼 내용에서 특정 태그 <div>와 </div> 사이의 모든 문자를 원하는 문자열로 업데이트 하려고 합니다.

 

---------------------------------------------

테스트 입니다. 테스트 입니다.

<div>안녕하세요. <b>안녕하세요</b>안녕하세요. 안녕하세요.</div>

테스트 입니다.테스트 입니다.

 

--------------------------------

 

아래와 같은 결과를 얻고 싶은데요.

 

테스트 입니다. 테스트 입니다.

<div>변경 되었습니다.</div>

테스트 입니다.테스트 입니다.

 

 

 

 

이 질문에 댓글 쓰기 :

답변 2


-- 테이블 생성
CREATE TABLE `item` (
  `itemno` int(11) NOT NULL,
  `itemname` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 


-- 데이터 생성
INSERT INTO `item` VALUES 
     ( 1, '장갑')
    ,( 2, '모자')
    ,( 3, '토시')
    ,( 4, '신발')
    ,( 5, '안경')
    ,( 6, '<div>안녕하세요. <b>안녕하세요</b>안녕하세요. 안녕하세요.</div>')
    ,( 7, '<b>안녕하세요</b>안녕하세요. 안녕하세요.</div>')
    ,( 8, '안녕하세요</b>안녕하세요. 안녕하세요.</div>')
    ,( 9, '</b>안녕하세요. 안녕하세요.</div>')
    ,(10, '<div>안녕하세요.</div>')
    ,(11, '<b>안녕하세요.</b>')
    ,(12, '<div><b>안녕하세요.</b></div><div><b>안녕하세요.</b></div>')
    ,(13, 'abc<div><b>안녕하세요.</b></div><div><b>안녕하세요.</b></div>def')
    ,(14, 'ㄱ<div><b>안녕하세요.</b></div><div><b>안녕하세요.</b></div>쀍')
    ,(15, '1<div>234</div>5');
SELECT * FROM item;
/*
+--------+-------------------------------------------------------------------------------------+
| itemno | itemname                                                                            |
+--------+-------------------------------------------------------------------------------------+
|      1 | 장갑                                                                                |
|      2 | 모자                                                                                |
|      3 | 토시                                                                                |
|      4 | 신발                                                                                |
|      5 | 안경                                                                                |
|      6 | <div>안녕하세요. <b>안녕하세요</b>안녕하세요. 안녕하세요.</div>                     |
|      7 | <b>안녕하세요</b>안녕하세요. 안녕하세요.</div>                                      |
|      8 | 안녕하세요</b>안녕하세요. 안녕하세요.</div>                                         |
|      9 | </b>안녕하세요. 안녕하세요.</div>                                                   |
|     10 | <div>안녕하세요.</div>                                                              |
|     11 | <b>안녕하세요.</b>                                                                  |
|     12 | <div><b>안녕하세요.</b></div><div><b>안녕하세요.</b></div>                          |
|     13 | abc<div><b>안녕하세요.</b></div><div><b>안녕하세요.</b></div>def                    |
|     14 | ㄱ<div><b>안녕하세요.</b></div><div><b>안녕하세요.</b></div>쀍                      |
|     15 | 1<div>234</div>5                                                                    |
+--------+-------------------------------------------------------------------------------------+
15 rows in set (0.00 sec)
*/

 


-- 데이터 확인
SELECT *, 
     INSTR(itemname, '<div>') c_begin 
    ,INSTR(REVERSE(itemname), '>vid/<') c_end 
    ,SUBSTR(itemname, 1, INSTR(itemname, '<div>') - 1) c_head
    ,SUBSTR(itemname, 0 - INSTR(REVERSE(itemname), '>vid/<') + 1) c_tail
FROM 
    item
WHERE 
    itemname REGEXP '<div>.+</div>';
/*
+--------+-------------------------------------------------------------------------------------+---------+-------+--------+--------+
| itemno | itemname                                                                            | c_begin | c_end | c_head | c_tail |
+--------+-------------------------------------------------------------------------------------+---------+-------+--------+--------+
|      6 | <div>안녕하세요. <b>안녕하세요</b>안녕하세요. 안녕하세요.</div>                     |       1 |     1 |        |        |
|     10 | <div>안녕하세요.</div>                                                              |       1 |     1 |        |        |
|     12 | <div><b>안녕하세요.</b></div><div><b>안녕하세요.</b></div>                          |       1 |     1 |        |        |
|     13 | abc<div><b>안녕하세요.</b></div><div><b>안녕하세요.</b></div>def                    |       4 |     4 | abc    | def    |
|     14 | ㄱ<div><b>안녕하세요.</b></div><div><b>안녕하세요.</b></div>쀍                      |       2 |     2 | ㄱ     | 쀍     |
|     15 | 1<div>234</div>5                                                                    |       2 |     2 | 1      | 5      |
+--------+-------------------------------------------------------------------------------------+---------+-------+--------+--------+
6 rows in set (0.00 sec)
*/

 


-- 업데이트
START TRANSACTION;
UPDATE item SET 
    itemname = CONCAT(
         SUBSTR(itemname, 1, INSTR(itemname, '<div>') - 1) -- c_head 
        ,'<div>변경 되었습니다.</div>'
        ,SUBSTR(itemname, 0 - INSTR(REVERSE(itemname), '>vid/<') + 1) -- c_tail
    ) 
WHERE 
    itemname REGEXP '<div>.+</div>';
/*
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6  Changed: 6  Warnings: 0
*/
SELECT * FROM item;
/*
+--------+---------------------------------------------------------------+
| itemno | itemname                                                      |
+--------+---------------------------------------------------------------+
|      1 | 장갑                                                          |
|      2 | 모자                                                          |
|      3 | 토시                                                          |
|      4 | 신발                                                          |
|      5 | 안경                                                          |
|      6 | <div>변경 되었습니다.</div>                                   |
|      7 | <b>안녕하세요</b>안녕하세요. 안녕하세요.</div>                |
|      8 | 안녕하세요</b>안녕하세요. 안녕하세요.</div>                   |
|      9 | </b>안녕하세요. 안녕하세요.</div>                             |
|     10 | <div>변경 되었습니다.</div>                                   |
|     11 | <b>안녕하세요.</b>                                            |
|     12 | <div>변경 되었습니다.</div>                                   |
|     13 | abc<div>변경 되었습니다.</div>def                             |
|     14 | ㄱ<div>변경 되었습니다.</div>쀍                               |
|     15 | 1<div>변경 되었습니다.</div>5                                 |
+--------+---------------------------------------------------------------+
15 rows in set (0.00 sec)
*/
COMMIT;
-- ROLLBACK;

 

답변 정말 감사합니다.
아래처럼 해봤는데 업데이트가 안되네요. 어디가 문제일까요?;;

$sql = " UPDATE name SET post = CONCAT(SUBSTR(post, 1, INSTR(post, '<div>') - 1) -- c_head ,'<div>변경 되었습니다.</div>' ,SUBSTR(post, 0 - INSTR(REVERSE(post), '>vid/<') + 1) -- c_tail) WHERE post REGEXP '<div>.+</div>' ID = '734' ";

정규식이용해서 한번 테스트해봤는데요

응용해서 사용해보시면 되지 않으까 합니다.

 

SELECT REGEXP_REPLACE(itemname, '<div>.+</div>$', '<div>변경 되었습니다.</div>') FROM `item`;

 

UPDATE item SET itemname = REGEXP_REPLACE(itemname, '<div>.+</div>$', '<div>변경 되었습니다.</div>');

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
  • 질문이 없습니다.
전체 0
© SIRSOFT
현재 페이지 제일 처음으로