5

我有一个数据库表mytable,其列采用 Varchar 格式,列date具有 Datetime 值。我想用按日期分组的某些参数来计算名称。这是我所做的:

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

4 回答 4

8

你写:

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

确实如此。MySQL 的 LIKE 运算符(通常是 SQL)不支持范围表示法,仅支持简单的通配符。

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

于 2012-09-27T01:07:18.167 回答
5

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

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

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

您当前的查询正在寻找一个字面意思为“[az]”的字符串。

更新:

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)
于 2012-09-27T01:07:55.657 回答
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

仅供参考,MySQL 的字符串很糟糕,所以你真的应该在插入数据库之前进行修剪。这样,您就不会在每次想要选择时都获得所有疯狂的开销。

于 2012-09-27T01:11:39.887 回答
2

我相信您想使用 WHERE REGEXP '^[az]$' 而不是 LIKE。

于 2012-09-27T01:07:12.167 回答