MySQL:如何检查提供的值是数字/整数还是字母?

时间:2012-04-19 00:55:13

标签: mysql sql php-5.3

如何检查提供的值是数字/整数还是字母?

例如,这是我的工作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)

' 7 '是可变的,有时它是一个数字,有时它是' self '。

所以当它是一个数字时,p.parent_id != p.page_id

其他p.parent_id = p.page_id

但我可以把它弄好,因为我的SQL查询总是返回p.parent_id != p.page_id

2 个答案:

答案 0 :(得分: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,而不是NULL。

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)

答案 1 :(得分: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

假设mysql隐式转换1TRUE0FALSE