给出2个表tbl1和tbl2。如果tbl2中的值不是NULL或空字符串(''),则应使用相应行中的tbl2值更新/替换tbl1中的值。出于任何原因,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;
答案 0 :(得分:2)
问题在于这个谓词:
t2.val != ''
true
时,这会对t2.val = 0
进行评估。这是由于隐式类型转换。检查this demo以查看您的身份。
谓词不是必需的,因为val
的类型为tinyint(3)
(根据提供的sql小提琴中给出的表定义)。因此,请将其从UPDATE
声明中删除,这样你就可以了。
答案 1 :(得分:0)
您可以更简单地将查询编写为:
UPDATE tbl1 t1 JOIN
tbl2 t2
ON t1.id = t2.id
SET t1.val = t2.val
WHERE t2.val IS NOT NULL;
Giorgos解释说,查询的主要问题是数字列与字符串的比较 - 以及由此产生的隐式类型转换。
但是,这个版本也是:
JOIN
语法的逻辑,因此查询的意图更加清晰。WHERE
子句。这使得查询更有效,因为它不会尝试更新所有行。答案 2 :(得分:0)
如果tbl2中的列val是一个整数字段,所以你不能把''int it,它会返回0.所以你只能检查空值。在这种情况下,您的查询将正常工作。
UPDATE
tbl1 t1,
tbl2 t2
SET
t1.val = IF( t2.val IS NOT NULL, t2.val, t1.val)
WHERE
t1.id = t2.id;