0

我需要从 SELECT 查询中的名称字段中删除数字。这些数字可能位于字符串的末尾。示例如下:

Some Name
Namewithnospace
NamewithInt 100   <--- I want to remove this int from the string

我不能保证字符串的第一部分不包含空格,尽管我可以相当确定该数字将是字符串的最后一部分。此外,大多数数据不会有空格。

我可以看到必须有一个解决方案REVERSE()SUBSTRING()但无法弄清楚如何不破坏没有空格或有空格但没有整数的数据。

编辑:下面是 Ollie 向我指出的 MySQL C 函数的定义,我对正则表达式进行了更改(在函数的输出中包含空格和标点符号):

DELIMITER !

DROP FUNCTION IF EXISTS alphas! 

CREATE FUNCTION alphas ( str VARCHAR(255) ) 
               RETURNS VARCHAR(255) 
               DETERMINISTIC
BEGIN 
  DECLARE i, len SMALLINT DEFAULT 1; 
  DECLARE ret VARCHAR(255) DEFAULT ''; 
  DECLARE c VARCHAR(1); 
  SET len = CHAR_LENGTH( str ); 
  REPEAT 
    BEGIN 
      SET c = MID( str, i, 1 ); 
      IF c REGEXP '[[:alpha:]]' OR c REGEXP '[[:space:]]' THEN 
        SET ret=CONCAT(ret,c); 
      END IF; 
      SET i = i + 1; 
    END; 
  UNTIL i > len END REPEAT; 
  RETURN ret; 
END !
DELIMITER ; 
4

2 回答 2

1

让自己这个存储的函数称为alphas. 它一一检查其输入文本字符串的字符并删除所有数字。

DELIMITER !

DROP FUNCTION IF EXISTS alphas! 

CREATE FUNCTION alphas ( str VARCHAR(255) ) 
                   RETURNS VARCHAR(255) 
                   DETERMINISTIC
BEGIN 
  DECLARE i, len SMALLINT DEFAULT 1; 
  DECLARE ret VARCHAR(255) DEFAULT ''; 
  DECLARE c VARCHAR(1);   /* NOT CHAR!  NOT CHAR! NOT CHAR! */ 
  SET len = CHAR_LENGTH( str ); 
  REPEAT 
    BEGIN 
      SET c = MID( str, i, 1 ); 
      IF NOT c REGEXP '[[:digit:]]' THEN 
        SET ret=CONCAT(ret,c); 
      END IF; 
      SET i = i + 1; 
    END; 
  UNTIL i > len END REPEAT; 
  RETURN ret; 
END !
DELIMITER ; 

然后这样做。

 SELECT alphas(column) AS alphacolumn

这是一个有用的资源,我从中抄袭了这个功能。 http://www.artfulsoftware.com/infotree/qrytip.php?id=815

于 2013-01-02T17:13:05.057 回答
0

如果您可以选择使用UDF,则可以使用REGEXP_REPLACE。您可以将其与模式一起使用'[0-9]+$'以删除数字。

于 2013-01-02T13:43:38.103 回答