MySQL LIKE与范围不起作用

时间:2012-09-27 00:57:08

标签: mysql sql-like

我有一个数据库表 mytable ,其中包含Varchar格式的列 name ,以及带有Datetime值的列 date 。我想用按日期分组的某些参数来计算名称。这是我的工作:

SELECT
    CAST(t.date AS DATE) AS 'date',
    COUNT(*) AS total,
    SUM(LENGTH(LTRIM(RTRIM(t.name))) > 4 
        AND (LOWER(t.name) LIKE '%[a-z]%')) AS 'n'
FROM
    mytable t
GROUP BY 
    CAST(t.date AS DATE)

这里的范围语法似乎有问题,如果我只做LIKE 'a%'它会正确计算所有以'a'开头的字段。但是,上面的查询为n返回0,尽管应该计算包含至少一个字母的所有字段。

4 个答案:

答案 0 :(得分:4)

你写道:

  

这里的范围语法似乎有问题

确实如此。 MySQL的LIKE运算符(通常是SQL)does not support range notation,只是简单的通配符。

尝试MySQL的非标准RLIKE(a.k.a. REGEXP),以获得更全面的模式匹配。

答案 1 :(得分:4)

我相信LIKE只是用于搜索字符串的一部分,但听起来你想要实现一个正则表达式来搜索一个范围。

在这种情况下,请改用REGEXP。例如(简化):

SELECT * FROM mytable WHERE name REGEXP "[a-z]"

您当前的查询正在查找字符串“[a-z]”。

更新:

SELECT
CAST(t.date AS DATE) AS 'date',
COUNT(*) AS total,
SUM(LENGTH(LTRIM(RTRIM(t.name))) > 4 
    AND (LOWER(t.name) REGEXP '%[a-z]%')) AS 'n'
FROM
mytable t
GROUP BY 
CAST(t.date AS DATE)

答案 2 :(得分:2)

我相信你想使用WHERE REGEXP'^ [a-z] $'而不是LIKE。

答案 3 :(得分:2)

你的LIKE语句中有正则表达式,但这不起作用。您需要使用RLIKEREGEXP

SELECT CAST(t.date AS DATE) AS date,
    COUNT(*) AS total
FROM mytable AS t
WHERE t.name REGEXP '%[a-zA-Z]%' 
GROUP BY CAST(t.date AS DATE)
HAVING SUM(LENGTH(LTRIM(RTRIM(t.name))) > 4

同样只是FYI,MySQL对字符串很糟糕,所以在插入数据库之前你真的应该修剪。这样你每次想要选择都不会得到那么疯狂的开销。