테스트 사이트 - 개발 중인 베타 버전입니다

mysql 컬럼 특정 태그 사이만 변경 채택완료

OCPlicense 3년 전 조회 1,870

안녕하세요.

mysql에서

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

 

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

 

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

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

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

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

 

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

 

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

 

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

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

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

 

 

 

 

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트
3년 전

</p>

<p>-- 테이블 생성

CREATE TABLE `item` (

  `itemno` int(11) NOT NULL,

  `itemname` text

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;</p>

<p>

 

</p>

<p>-- 데이터 생성

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');</p>

<p>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)

*/</p>

<p>

 

</p>

<p>-- 데이터 확인

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)

*/</p>

<p>

 

</p>

<p>-- 업데이트

START TRANSACTION;</p>

<p>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)

*/</p>

<p>COMMIT;

-- ROLLBACK;</p>

<p>

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

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

$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' ";
배르만
3년 전
-- c_head, -- c_tail
이 구문은 SQL 의 한줄주석 입니다.
쿼리문이 개행문자를 포함하지 않을때는 /* c_head */ 처럼 사용해야 하거나 아예 빼버리는게 낫습니다.

댓글을 작성하려면 로그인이 필요합니다.

3년 전

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

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

 

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

 

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

O
OCPlicense
3년 전
답변 감사합니다. mysql은 거의 처음이라서 뭐가 뭔지 잘 모르겠네요.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인