gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:29:49 25 4
gpt4 key购买 nike

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

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

通过将 IF 替换为 IFNULL(a.testool, ''),问题已“修复”

其他一些替换也失败了(而选择本身有效):

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

其他版本的MySQL是否存在此错误?

编辑 -- 使用 select 的查询结果:

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

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

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

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

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

就在我尝试在新连接中执行查询后,Workbench 崩溃了。相关吗?

编辑——发现显式转换有效:

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

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

为什么它有时有效,而其他的却无效? <-- 这部分最糟糕。

最佳答案

这个:

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

永远不会变成null,你的条件:

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 仅在参数为 null 时返回“true”。

关于mysql - IF(a.testcol IS NULL ,'' ,a.testcol) IS NOT NULL 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14964921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com