您可以使用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)