5

我正在浏览 MySQL 中的一些数据,我需要从看起来像这样的列中删除一些信息。

**sometext** (something else)

不幸的是,数据不一致;并非所有数据都遵循这种结构,其中一些只有第一部分。

**sometext**

所以我需要一种方法来删除括号之间的所有内容,然后删除括号本身,以便留下**sometext**部分。

4

6 回答 6

13

使用此解决方案:

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因为它将删除第一个左括号和最后一个右括号之间的所有内容。

SQLFiddle 演示

于 2012-08-31T11:21:54.637 回答
3

你可以尝试使用函数SUBSTRING_INDEX。语法是:

SUBSTRING_INDEX(str,delim,count)

在这种情况下,它可能类似于:

UPDATE tbl
SET    txt = (SELECT SUBSTRING_INDEX(txt, '(', 1));

这会有所帮助,尽管我没有检查查询。有关此功能的进一步参考,您可以查看此处

于 2012-08-31T11:17:44.593 回答
2

MySQL 不支持正则表达式,所以唯一的方法是使用 PHP 等编写的外部程序,或者使用存储过程。

于 2012-08-31T11:15:27.983 回答
0

您可以使用 UDF(用户定义函数)

看看这个https://launchpad.net/mysql-udf-regexp

所以你只需要创建你的括号匹配正则表达式并使用这个函数的普通 REPLACE 语句:)

于 2012-08-31T11:15:56.220 回答
0

选择试试这个:

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'))),'')

在更新语句中使用它。

于 2012-08-31T11:22:12.890 回答
0

这是一个用户定义的函数,它可以使用字符串中的多个括号对:

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_parens 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 ;
于 2019-06-13T14:25:25.853 回答