gpt4 book ai didi

带 IF 条件的 MySQL 更新将 0 视为 '' 或 NULL

转载 作者:行者123 更新时间:2023-11-29 07:27:06 27 4
gpt4 key购买 nike

给定 2 个表 tbl1 和 tbl2。如果 tbl2 中的值不是 NULL 或空字符串 (''),则 tbl1 中的值应更新/替换为相应行中 tbl2 中的值。无论出于何种原因,MySQL(和 MariaDB)都将 0 值视为空字符串或 NULL 值。有什么办法可以绕过它吗?

编辑:这只是一个简单的示例。实际上我不知道该字段的类型。它是一个自动 PHP 脚本,可为两个表中存在的每个字段生成查询的 SET 语句。这可以是字符串或(微小)整数字段、文本等。我​​想脚本应该检查字段的类型,并根据字段的类型决定如何构建语句的 IF 部分。当我正确理解这些注释时,我不能期望对整数字段进行类似字符串的比较会得到有用的结果。//

http://sqlfiddle.com/#!9/573fc

UPDATE
tbl1 t1,
tbl2 t2
SET
t1.val = IF(t2.val != '' AND t2.val IS NOT NULL, t2.val, t1.val)
WHERE
t1.id = t2.id;

让我们假设 tbl1:

id | val
1 | 1

让我们假设 tbl2:

id | val
1 | 0

现在我想用 tbl2 的 val 中的值更新 tbl1 中的 val,如果 tbl2 中的 val 既不是 NULL 也不是空字符串。由于 tbl2 中的 val 为 0,因此 tbl1 中的 val 也应变为 0。但这并没有发生。我不知道为什么。如果 tbl2 中的 val 是 1、2、3 或其他任何不同于 0、NULL 或 '' 的值,则上面的查询可以正常工作。

真正的查询更复杂,并且更新更多字段,具体取决于它们的值。但这部分是困扰我的部分。由于字段可以有不同的类型(字符串、整数、日期等),所以我无法真正“围绕它”工作。

编辑 2/解决方案/解决方法:

由于我无法对代码和数据库进行太多更改,所以我想出了这个解决方案。它可能不是最漂亮的,也远非整洁干净,但它确实有效。

UPDATE
tbl1 t1,
tbl2 t2
SET
t1.val = IF((t2.val != '' AND t2.val IS NOT NULL) OR t2.val = '0', t2.val, t1.val)
WHERE
t1.id = t2.id;

最佳答案

问题出在这个谓词上:

t2.val != ''

t2.val = 0 时,该值评估为 true。这是由于隐式类型转换造成的。检查this demo亲自看看。

谓词不是必需的,因为 val 的类型为 tinyint(3) (根据提供的 sql fiddle 中给出的表定义)。因此,将其从 UPDATE 语句中删除即可。

关于带 IF 条件的 MySQL 更新将 0 视为 '' 或 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34156025/

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