LIKE查询中的数字通配符?

时间:2014-08-11 21:04:23

标签: php mysql sql

我的桌子上有很多名字,后跟一个数字。所有条目都使用相同的语法,但有些名称的数字从1到99

示例:

john 1
john 2
john 3
john smith 1
john smith 2

在这个例子中,我试图选择所有“john”条目

SELECT * FROM my_table WHERE name LIKE 'john %'

问题是它还会从“john smith”中选择条目。我怎么能避免这种情况?是否可以使用某种通配符来做类似的事情:

SELECT * FROM my_table WHERE name LIKE 'john [0-9]'

2 个答案:

答案 0 :(得分:3)

使用REGEXP似乎最简单的查询是:

select * from tablename where name REGEXP '^john smith [[:digit:]]{1,2}$';

将表达式限制为最多2位数,从而有效地将其限制为0-99。

或者

select * from tablename where name REGEXP '^john smith [[:digit:]]+$';

不会将其限制为0-99但允许空格后的任何数字组合。

请注意,如果您在开头没有包含^,那么就像" x john smith 2"会被允许的。如果你不在最后包括$,那么"约翰史密斯2 x"将被允许​​。

为了捕捉约翰和约翰史密斯需要更像的东西:

select * from tablename where name REGEXP '^john [[:alpha:]]{0,}[[:space:]]{0,1}[[:digit:]]{1,2}$' ;

{n,n}是重复元素的最小和最大时间。所以对于" john"我们不会有这个alpha元素,但对于" john smith"我们将有一组字母字母,因此{0,}表示最小0字母字符,没有最大字母。这与空间相同,因为" john"我们没有这个空间。但是我们可能希望将此处可能出现的空格数限制为1,因此最大部分包括{0,1}

答案 1 :(得分:2)

LIKE没有类似内容,但您可以使用REGEXP

你可能会从以下方面获得最佳表现:

SELECT * 
  FROM my_table 
 WHERE name LIKE 'john %'
   AND 0 < SUBSTR(name,6)

这会将字符串的第二部分转换为数字并查看它是否大于0,任何以字母开头的内容都将转换为0。

在这种情况下,LIKE仍然可以使用name上的索引。

我肯定会质疑你的数据结构,名称后面的数字应该在一个单独的数字列中。想想看,姓氏'史密斯'也应该在一个单独的专栏中!