2

这是 MySQL (5.1.41-community) 中的错误吗?

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(a.testtool, '') 替换 IF 来“修复”该问题

其他一些替换也失败了(而选择本身起作用):

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

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

编辑——选择查询的结果:

消息:错误代码:1292。截断不正确的整数值:''

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

编辑——大约 2 小时后我又试了一次。最后两个语句“有效”(记住将它们插入上面的查询中......)。第一个替换语句失败。然后数字 2 和 3 再次失败。

所以看起来语句 1 是罪魁祸首(原来的,它现在出错了..).. 并且可能存在某种不良状态,其中产生相同中间结果的语句也失败了。

那么接下来的问题是——有没有办法确保查询被重置?

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

编辑——发现显式演员表有效:

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

所以我找到了解决方法。问题是——为什么''(引号内有任何内容)会被解释为整数?我什至通过连接''将它解释为DOUBLE。

为什么它有时会起作用,而其他时候却不起作用?<--这部分最烂。

4

1 回答 1

2

This:

IF(a.testcol IS NULL,'',a.testcol)

never become null, and your condition:

WHERE IF(a.testcol IS NULL,'',a.testcol) IS NOT NULL

will return always all rows.


When testcol is null you assigning empty string to it: ''

Empty string is diffrent from NULL and this is not a bug.

You should use something like this:

SELECT testcol FROM
(
    SELECT '1' AS testcol
    UNION
    SELECT null
) a

WHERE IF(a.testcol IS NULL, NULL ,a.testcol) IS NOT NULL

or:

SELECT testcol FROM
(
    SELECT '1' AS testcol
    UNION
    SELECT null
) a

WHERE ISNULL(a.testcol) = true 

ISNULL just returns "true" when argument is null.

于 2013-02-19T22:46:29.563 回答