MySQL删除两个括号之间的字符

5

我正在处理MySQL中的一些数据,需要从一个类似这样的列中删除一些信息。

**sometext** (something else)

数据不一致,有些数据不符合这种结构,只有第一部分。
**sometext**

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

你尝试过什么?它需要是一次性的解决方案吗(所以也许你可以编写一些小程序来处理表格)? - Styxxy
请访问http://dev.mysql.com/doc/refman/5.1/de/string-functions.html,找到第一个括号,然后在所有内容中找到第二个括号并将其截取。 - edze
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)

... 如果你想保留 keepthistext1keepthistext2,因为它将删除第一个左括号和最后一个右括号之间的所有内容

SQLFiddle演示


@TomChew-headMillard 看看我刚发布的更健壮的解决方案(带有新的 SQLFiddle 演示)。现在它将保留最后一个闭合括号之后的任何内容。 - Zane Bien

3
您可以尝试使用函数SUBSTRING_INDEX,它的语法如下:
SUBSTRING_INDEX(str,delim,count)

在这种情况下,可能会是这样的内容:
UPDATE tbl
SET    txt = (SELECT SUBSTRING_INDEX(txt, '(', 1));

这将有所帮助,尽管我还没有检查查询。 如果您需要进一步了解此功能,请点击这里


2

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


有没有办法通过空格分割数据,检查第二部分不返回黑色,然后运行更新查询,或者编写一些PHP会更容易? - Millard
你可以不使用正则表达式进行字符串操作。 - edze
@edze 当然,但在这种情况下,你不能在没有正则表达式的情况下删除两个分隔符之间的任意内容。 - slugonamission
我只需要删除括号内的所有数据,如果这会改变任何内容。 - Millard

1
这里是一个用户自定义函数,可以处理字符串中的多个括号对:
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 ;

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

请在更新语句中使用此代码。

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接