我需要从SELECT查询中的名称字段中删除数字。这些数字可能位于字符串的末尾。例子如下:
Some Name
Namewithnospace
NamewithInt 100 <--- I want to remove this int from the string
我不能保证字符串的第一部分不会包含空格,尽管我可以相当确定该数字是字符串的最后一部分。此外,大多数数据都没有空间。
我可以看到必须有一个使用REVERSE()
和SUBSTRING()
的解决方案,但无法解决如何不破坏没有空格的数据,或者那些有空格但没有空格的数据整数。
编辑:下面是Ollie向我指出的MySQL C函数的定义,我对regexp进行了更改(在函数的输出中包含空格和标点符号):
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 ;
答案 0 :(得分: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
答案 1 :(得分:0)
如果您使用UDF是一个选项,则可以使用REGEXP_REPLACE。您可以将其与模式'[0-9]+$'
一起使用以删除数字。