我正在处理MySQL中的一些数据,需要从一个类似这样的列中删除一些信息。
**sometext** (something else)
数据不一致,有些数据不符合这种结构,只有第一部分。
**sometext**
所以我需要一种方法来删除括号中的所有内容,然后删除括号本身,以便只留下
**sometext**
部分。我正在处理MySQL中的一些数据,需要从一个类似这样的列中删除一些信息。
**sometext** (something else)
**sometext**
**sometext**
部分。使用这个解决方案:
UPDATE tbl
SET txt = REPLACE(txt, SUBSTRING(txt, LOCATE('(', txt), LENGTH(txt) - LOCATE(')', REVERSE(txt)) - LOCATE('(', txt) + 2), '')
WHERE txt LIKE '%(%)%'
请注意,由于 MySQL 的正则表达式支持较少,因此此方法对于(将返回空白)无法正常工作。
(replacetext1) keepthistext1 (replacetext2) keepthistext2 (replacetext3)
... 如果你想保留 keepthistext1
和 keepthistext2
,因为它将删除第一个左括号和最后一个右括号之间的所有内容。
SUBSTRING_INDEX
,它的语法如下:SUBSTRING_INDEX(str,delim,count)
UPDATE tbl
SET txt = (SELECT SUBSTRING_INDEX(txt, '(', 1));
这将有所帮助,尽管我还没有检查查询。 如果您需要进一步了解此功能,请点击这里。
MySQL不支持正则表达式,所以唯一的方法是使用用PHP等编写的外部程序或使用存储过程。
DELIMITER //
CREATE FUNCTION REMOVE_BRACKETS(input TEXT CHARACTER SET utf8 COLLATE utf8_bin)
RETURNS TEXT CHARACTER SET utf8 COLLATE utf8_bin
BEGIN
DECLARE output TEXT CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '';
DECLARE in_brackets BOOL DEFAULT FALSE;
DECLARE length INT;
IF(input IS NULL)
THEN
RETURN NULL;
END IF;
WHILE(TRUE) DO
SET length = LOCATE(CASE WHEN in_brackets THEN ']' ELSE '[' END, input);
IF(length = 0)
THEN
RETURN CONCAT(output, input);
END IF;
IF(in_brackets)
THEN
SET in_brackets = FALSE;
ELSE
SET output = CONCAT(output, SUBSTRING(input, 1, length - 1));
SET in_brackets = TRUE;
END IF;
SET input = SUBSTRING(input, length + 1);
END WHILE;
END //
DELIMITER ;
选择尝试这个:
SELECT REPLACE('abdcejkhh klhklhkl (abc) agjkk',SUBSTRING('abdcejkhh klhklhkl (abc) agjkk',POSITION('(' IN 'abdcejkhh klhklhkl (abc) agjkk'),(length('abdcejkhh klhklhkl (abc) agjkk')-POSITION(')' IN 'abdcejkhh klhklhkl (abc) agjkk'))),'')
你可以使用UDF(用户自定义函数)
看看这个 https://launchpad.net/mysql-udf-regexp
所以你只需要创建你的括号匹配正则表达式,并使用普通的REPLACE语句与这个函数一起使用 :)