mysql 컬럼 특정 태그 사이만 변경
본문
안녕하세요.
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;
!-->!-->!-->!-->
정규식이용해서 한번 테스트해봤는데요
응용해서 사용해보시면 되지 않으까 합니다.
SELECT REGEXP_REPLACE(itemname, '<div>.+</div>$', '<div>변경 되었습니다.</div>') FROM `item`;
UPDATE item SET itemname = REGEXP_REPLACE(itemname, '<div>.+</div>$', '<div>변경 되었습니다.</div>');
답변을 작성하시기 전에 로그인 해주세요.