2013-02-19 77 views
2

这是在MySQL(5.1.41 - 社区)中的错误 -IF(a.testcol IS NULL, '',a.testcol)IS NOT NULL不起作用

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表达式被无辜地放入查询中。

选择本身的作品。与插入语句结合使用时,它不起作用。内部选择旨在显示创建的临时表在被检查的列中可以具有空值。

这件事是通过用IFNULL代替IF(a.testool, '')

其他一些replacesments失败过(而自己的选择工作) “固定”:

1 IF (a.testcol, '', a.testcol) 
2 IF (a.testcol, '', '') 
3 IF ('', '', '') 

这个错误是否存在于其他版本的MySQL中?

编辑 - 与选择查询的结果:

消息:错误代码:1292截断不正确INTEGER值:“”

它应该具有的结果是两个“测试”字符串输入到zztest表中。

编辑 - 约2小时后我再次尝试了。最后两条语句“工作”(记住将它们插入上面的查询中)。第一个替换声明失败。然后数字2和三再次失败。

因此,它看起来像语句1是罪魁祸首(和原来的,它错误了现在..)..也许某种坏的状态存在的地方,产生相同中间结果的语句也失败。

因此,后续问题是 - 有没有办法确保查询被重置?

就在我尝试在新连接中执行查询后,工作台崩溃了..相关?

编辑 - 发现,有明确的转换工作:

IF (a.testcol, cast('' as char), cast('' as char)) 

所以我发现我周围的路。问题是 - 为什么“(将引号内的任何内容)解释为INTEGER?我甚至通过连接''将它解释为DOUBLE。

它为什么有时会工作,而不是其他人? < - 这部分吸吮的女仆。

+2

它不起作用?会发生什么,会发生什么? – nos 2013-02-19 18:53:11

回答

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 

ISNULL刚刚返回 “真” 时,参数为空。

+0

'ISNULL(a.testcol)= true'不是MySQL ...是吗?你不能只是做'WHERE a.testcol IS NULL'吗? – 2013-02-19 22:55:37

+0

@RocketHazmat ISNULL在MySQL中工作,你可以使用IS NULL,但我想告诉他为什么他的IF不起作用,我不知道他是如何使用它(我假设他向我们展示了非常简化的代码)。 – Kamil 2013-02-19 23:07:54

+0

我不知道'ISNULL'。但是,那么它不会是'WHERE ISNULL(a.testcol)'吗?我不认为MySQL有'true' /'false'关键字。 – 2013-02-19 23:11:48