1

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

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

4

2 回答 2

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)
于 2012-04-19T00:58:30.983 回答
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隐式1转换为TRUE0to 。FALSE

于 2012-04-19T01:01:49.787 回答