如何检查提供的值是数字/整数还是字母?
例如,这是我的工作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
。
答案 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隐式转换1
到TRUE
和0
到FALSE
。