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

a0x5cqrl  于 2023-02-28  发布在  Mysql
关注(0)|答案(6)|浏览(188)

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

**sometext** (something else)

遗憾的是,数据不一致;不是所有的数据都遵循这种结构,有些数据只有第一部分。

**sometext**

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

wnavrhmk

wnavrhmk1#

使用此解决方案:

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演示 *
w8rqjzmb

w8rqjzmb2#

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

SUBSTRING_INDEX(str,delim,count)

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

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

这将有所帮助,虽然我还没有检查查询。有关此函数的进一步参考,您可以查看这里

uqcuzwp8

uqcuzwp83#

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

lxkprmvk

lxkprmvk4#

下面是一个用户定义的函数,它可以实现这个功能,并且可以处理字符串中的多个括号对:

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 ;
sigwle7e

sigwle7e5#

可以使用UDF(用户定义函数)
看看这个https://launchpad.net/mysql-udf-regexp
因此,您只需创建与正则表达式匹配的括号,并将普通的REPLACE语句与此函数配合使用:)

5gfr0r5j

5gfr0r5j6#

选择尝试此:

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

在update语句中使用它。

相关问题