2012-09-27 104 views
1

我有一個數據庫表MYTABLE與格式的Varchar列和列日期有日期時間值。我想用某些按日期分組的參數來計算名稱。這是我做的:MySQL的LIKE與範圍不起作用

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

你寫:

似乎有什麼毛病範圍語法這裏

確實如此。 MySQL的LIKE操作符(和SQL一般)does not support range notation,只是簡單的通配符。

嘗試MySQL的非標準RLIKE(又名REGEXP),以獲得更全面的模式匹配。

+0

謝謝!這正是我需要的。 – sashkello

2

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

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

您的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是可怕的用繩子,所以你插入到數據庫之前,真的應該修剪。這樣,每次你想選擇的時候,你都不會得到那麼瘋狂的開銷。