这是MySQL(5.1.41社区)中的错误 -
CREATE TEMPORARY TABLE zztest (stuff varchar(20) NULL)
INSERT INTO zztest
SELECT
'test'
FROM (
select '1' as testcol
union
select null
) a
WHERE **IF(a.testcol IS NULL,'',a.testcol)** IS NOT NULL
这是一个简化的查询。 **之间的IF表达式应该用粗体表示。它来自动态查询,其中IF表达式被无辜地放入查询中。
选择本身有效。当与insert语句结合使用时,它不起作用。内部选择用于显示创建的临时表在被检查的列中可以有空值。
通过用IFNULL(a.testool,'')取代IF来解决这个问题
其他一些替换也失败了(而选择本身也有效):
1 IF (a.testcol, '', a.testcol)
2 IF (a.testcol, '', '')
3 IF ('', '', '')
其他版本的MySQL中是否存在此错误?
编辑 - 使用select:
查询的结果消息:错误代码:1292。截断错误的INTEGER值:''
它应该具有的结果是两个'test'字符串被输入到zztest表中。
编辑 - 我在大约2个小时后再次尝试了。最后两个语句“有效”(记得将它们插入上面的查询中..)。第一个替换声明失败。然后数字2和3再次失败。
所以看起来声明1是罪魁祸首(原来,它现在错误了......)..也许存在某种不良状态,其中产生相同中间结果的语句也会失败。
那么接下来的问题是 - 有没有办法确保查询被重置?
刚尝试在新连接中执行查询后,工作台崩溃了..相关?
编辑 - 发现显式投射有效:
IF (a.testcol, cast('' as char), cast('' as char))
所以我找到了自己的方式。问题是 - 为什么会(在引号内的任何内容)被解释为INTEGER?我甚至通过连接''来将它解释为DOUBLE。
为什么它有时会起作用,而不是其他人呢? < - 这部分吸了女主人。
答案 0 :(得分:2)
这:
IF(a.testcol IS NULL,'',a.testcol)
永远不会变成空,你的条件是:
WHERE IF(a.testcol IS NULL,'',a.testcol) IS NOT NULL
将始终返回所有行。
当testcol为null时,为其分配空字符串:''
空字符串与NULL
不同,这不是错误。
你应该使用这样的东西:
SELECT testcol FROM
(
SELECT '1' AS testcol
UNION
SELECT null
) a
WHERE IF(a.testcol IS NULL, NULL ,a.testcol) IS NOT NULL
或:
SELECT testcol FROM
(
SELECT '1' AS testcol
UNION
SELECT null
) a
WHERE ISNULL(a.testcol) = true
当参数为null时, ISNULL
只返回“true”。