2012-04-19 140 views
1

如何檢查提供的值是數字/整數還是字母?MySQL:如何檢查提供的值是數字/整數還是字母?

舉例來說,這是我工作的SQL,

SELECT 
    p.* 

FROM page AS p 

WHERE p.title = 'home' 

AND IF(CONVERT('7', SIGNED INTEGER) IS NOT NULL, p.parent_id != p.page_id, p.parent_id = p.page_id) 

'' 是可變的,有時它是一個數字,有時是 '自我'。

所以當它是一個數字,然後p.parent_id != p.page_id

否則p.parent_id = p.page_id

但如右圖我的SQL查詢返回總是p.parent_id != p.page_id我能得到它。

+1

如果變量是非數字的,它總是「self」嗎?如果是這樣,你能不能簡單地顛倒你的想法,並檢查'​​IF(var ='self',...'? – pilcrow 2012-04-19 01:09:37

+0

是的,我想我也可以這樣做!謝謝提示! – laukok 2012-04-19 01:13:57

回答

3

您可以使用REGEXP.

AND CASE 
    WHEN ('7' REGEXP '^[0-9]+$') THEN 
     p.parent_id != p.page_id 
    ELSE p.parent_id = p.page_id 
END 

CONVERT()未能按預期工作的原因是一個非數字的字符串總是被鑄造爲0,而不是空。

mysql> SELECT CONVERT('7a', SIGNED INTEGER); 
+-------------------------------+ 
| CONVERT('7a', SIGNED INTEGER) | 
+-------------------------------+ 
|        7 | 
+-------------------------------+ 

mysql> SELECT CONVERT('self', SIGNED INTEGER); 
+---------------------------------+ 
| CONVERT('self', SIGNED INTEGER) | 
+---------------------------------+ 
|        0 | <-- non-numeric strings always cast to 0 
+---------------------------------+ 

如果你比較0而不是NULL,但你沒有好的方法來測試,你的方法可能會工作。但是,如果該值實際爲0,則會失敗,其中會返回錯誤的比較結果。

AND IF(CONVERT('7', SIGNED INTEGER) <> 0, p.parent_id != p.page_id, p.parent_id = p.page_id) 
+0

謝謝你的回答! ) – laukok 2012-04-19 01:12:56

0

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

WHERE 
    '7' REGEXP '[[:digit:]]+' AND p.parent_id != p.page_id 
    OR '7' REGEXP '[[:alpha:]]+' AND p.parent_id = p.page_id 

或多個最佳

WHERE 
    '7' REGEXP '[[:digit:]]+' AND p.parent_id != p.page_id 
    OR '7' = 'self'    AND p.parent_id = p.page_id 

假設隱式轉換1TRUE0FALSE由MySQL。

+2

'SELECT'7abcd'REGEXP'[[:digit:]] +''返回'1'。你需要錨定你的正則表達式。 – 2012-04-19 01:03:44

相關問題