有没有办法从MySQL中的列中提取与正则表达式匹配的文本?

时间:2010-07-22 19:00:39

标签: mysql

例如,如果特定列中的所有条目都具有[az] + [0-9] +形式,那么如何只提取前导字母,以便asdf123和as3456返回'asdf'和'as',分别?

3 个答案:

答案 0 :(得分:2)

这不适用于mysql正则表达式功能(除非安装一些似乎是为此而设计的udf)。从技术上讲,由于[0-9]是一个限制集,你可以在LOCATE中抛出10 LEAST个(注意& invalitdate 0),然后使用SUBSTRING。不是一张漂亮的照片:

SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,
  LEAST(
    IF(LOCATE(0,@var)=0,LENGTH(@var),LOCATE(0,@var)),
    IF(LOCATE(1,@var)=0,LENGTH(@var),LOCATE(1,@var)),
    IF(LOCATE(2,@var)=0,LENGTH(@var),LOCATE(2,@var)),
    IF(LOCATE(3,@var)=0,LENGTH(@var),LOCATE(3,@var)),
    IF(LOCATE(4,@var)=0,LENGTH(@var),LOCATE(4,@var)),
    IF(LOCATE(5,@var)=0,LENGTH(@var),LOCATE(5,@var)),
    IF(LOCATE(6,@var)=0,LENGTH(@var),LOCATE(6,@var)),
    IF(LOCATE(7,@var)=0,LENGTH(@var),LOCATE(7,@var)),
    IF(LOCATE(8,@var)=0,LENGTH(@var),LOCATE(8,@var)),
    IF(LOCATE(9,@var)=0,LENGTH(@var),LOCATE(9,@var))
   ) -1 ) as 'result';
+---------+
| result  |
+---------+
| asjdasd | 
+---------+

如果您需要,请查看udf。否则你最好抓取字段并在MySQL之外操作它。

编辑:如果数字符合整数,则可能导致脏乱:

SET @var ='asjdasd35433';
SELECT SUBSTRING(@var,1,LENGTH(@var)-LENGTH(CAST(REVERSE(@var) as UNSIGNED)));
+---------+
| result  |
+---------+
| asjdasd |
+---------+

答案 1 :(得分:1)

我自己没有使用它,但lib_mysqludf_preg library中可能会有一些UDF函数可以提供帮助。

答案 2 :(得分:0)

我没有用它,但回答你的问题:

MySQL Regex

从MySQL参考页面:

SELECT 'abcde' REGEXP 'a[bcd]{1,10}e';

编辑第二个想法(正如下面Mark所指出的),这只会返回文本是否包含在字符串中。不是字符串的匹配部分。

在进一步搜索时,这似乎不适用于MySQL的基本正则表达式函数。也许查询匹配值然后在MySQL之外进行比较可能就是答案?