2012-02-08 128 views
2

我有這個疑問多個條件:MySQL的SUBSTRING在WHERE子句

SELECT DISTINCT phone, department 
FROM `users` 
WHERE ((SUBSTRING(phone,1,3) = '399') 
AND (SUBSTRING(phone,5,4) BETWEEN '3400' AND '3499') 
OR (SUBSTRING(phone,1,3) = '244') 
AND (SUBSTRING (phone,5,4) BETWEEN '5400' AND '5499')) 

,讓我這個錯誤:

#1630 - FUNCTION Database.SUBSTRING does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual

的查詢工作,如果我只能用這個:

SELECT DISTINCT phone, department 
FROM `users` 
WHERE (SUBSTRING(phone,1,3) = '399') 
AND (SUBSTRING(phone,5,4) BETWEEN '3400' AND '3499') 

回答

8

根據MySQL Function Name Parsing,內置函數名稱(在您的案例中爲'SUBSTRING')和下面的「(」括號字符)之間不能有空格,這是默認的解析器行爲,用於區分構建的名稱。-in函數被用作函數調用或在nonexpression上下文標識符

所以,如果你刪除的最後一行「SUBSTRING」函數調用之後的空格,您的查詢將正常工作:

SELECT DISTINCT phone, department 
FROM `users` 
WHERE ((SUBSTRING(phone,1,3) = '399') 
AND (SUBSTRING(phone,5,4) BETWEEN '3400' AND '3499') 
OR (SUBSTRING(phone,1,3) = '244') 
AND (SUBSTRING(phone,5,4) BETWEEN '5400' AND '5499')) 
5

在SUBSTRING和()之間不能有空格。(有一個db選項如果你真的想要的話。

4

您在最後的子句中有一個額外的空間:

AND (SUBSTRING (phone,5,4) BETWEEN '5400' AND '5499')) 
       ^---here 

刪除,整個查詢將工作。