带有范围的 MySQL LIKE 不起作用

sas*_*llo 4 mysql sql-like

我有一个数据库表mytable,列采用 Varchar 格式,列日期为 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)
Run Code Online (Sandbox Code Playgroud)

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

pil*_*row 7

你写:

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

确实如此。MySQL 的 LIKE 操作符(以及一般的 SQL)不支持范围表示法,仅支持简单的通配符。

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


Dan*_*Dan 5

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

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

SELECT * FROM mytable WHERE name REGEXP "[a-z]"
Run Code Online (Sandbox Code Playgroud)

您当前的查询正在寻找字面意思是“[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)
Run Code Online (Sandbox Code Playgroud)