IF(a.testcol IS NULL,'',a.testcol)IS NOT NULL不起作用

时间:2013-02-19 18:38:10

标签: mysql

这是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。

为什么它有时会起作用,而不是其他人呢? < - 这部分吸了女主人。

1 个答案:

答案 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”。