我的桌子上有很多名字,后跟一个数字。所有条目都使用相同的语法,但有些名称的数字从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]'
答案 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
上的索引。
我肯定会质疑你的数据结构,名称后面的数字应该在一个单独的数字列中。想想看,姓氏'史密斯'也应该在一个单独的专栏中!