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

时间:2015-12-08 12:32:51

标签: mysql

给出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;

3 个答案:

答案 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;
相关问题