在我的SQL中有以下列
404
我想从中提取数字和非数字字符,所以我有这样的输出:
Delete a virtual machine
有人指出我需要以哪种方式开始寻找。该列有大约700条记录,并且没有遵循命名惯例,因此可以是数字前后的任意数量的字符。
BTW:返回的角色本身不需要Get information about a virtual machine
,空字符串也可以。数字的前导零也无关紧要。
答案 0 :(得分:0)
为了帮助您入门,请参阅MySQL Regex page。
以下是使用:alnum:
进行字母数字搜索的示例。替换:digit:
可能对您有用,可以提取中间的数字。
mysql> SELECT 'justalnums' REGEXP '[[:alnum:]]+'; -> 1
mysql> SELECT '!!' REGEXP '[[:alnum:]]+'; -> 0
答案 1 :(得分:0)
你可以创建这样的函数:https://dba.stackexchange.com/questions/106535/how-to-split-numbers-and-text-in-mysql
对前后的一些修改
DROP function IF EXISTS `pre`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `pre`(
vStr CHAR(75)) RETURNS char(32) CHARSET latin1
BEGIN
DECLARE vInd, vLen SMALLINT DEFAULT 1;
DECLARE vReturn CHAR(32) DEFAULT '';
DECLARE vCharacter CHAR(1);
REPEAT
SET vLen = CHAR_LENGTH(vStr);
BEGIN
SET vCharacter = MID(vStr,1,1);
IF vCharacter REGEXP '[[:digit:]|[:punct:]]' THEN
SET vReturn:=NULL;
RETURN vReturn;
ELSE
SET vCharacter = MID(vStr,vInd,1);
IF vCharacter REGEXP '[[:alpha:]]' THEN
SET vReturn=CONCAT(vReturn,vCharacter);
SET vInd =vInd+1;
ELSE
SET vInd:=vLen+1;
END IF;
END IF;
END;
UNTIL vInd > vLen END REPEAT;
RETURN vReturn;
END$$
DELIMITER ;
DROP function IF EXISTS `post`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `post`(
vStr CHAR(75)) RETURNS char(32) CHARSET latin1
BEGIN
DECLARE vInd,limite, vLen SMALLINT DEFAULT 1;
DECLARE vReturn CHAR(32) DEFAULT '';
DECLARE vCharacter CHAR(1);
SET vInd = 1;
SET vLen = CHAR_LENGTH(vStr);
SET limite=vLen;
REPEAT
BEGIN
SET vCharacter = MID(vStr,vLen,1);
IF vCharacter REGEXP '[[:digit:]|[:punct:]]' THEN
SET vReturn:=NULL;
RETURN vReturn;
ELSE
SET vCharacter = MID(vStr,vLen-vInd+1,1);
IF vCharacter REGEXP '[[:alpha:]]' THEN
SET vReturn=CONCAT(vCharacter,vReturn);
SET vInd=vInd+1;
ELSE
SET vInd=limite+1;
END IF;
END IF;
END;
UNTIL vInd > limite END REPEAT;
RETURN vReturn;
END$$
DELIMITER ;
并查询:
SELECT identifier,pre(identifier) as pre,num(identifier) as num,post(identifier) as post FROM table