[英]MySQL: How to copy row from one table to another with skipping empty rows in source table?
谁能帮我把这个 PHP/MySQLesque 伪代码变成一个有效的 MySQL 查询? 表 A 和 B 具有相同的列/列顺序。
UPDATE B SET
B.col_1 = A.col_1 IF(A.col_1 != '' AND A.col_1 != 0 AND A.col_1 != NULL),
B.col_2 = A.col_2 IF(A.col_2 != '' AND A.col_2 != 0 AND A.col_2 != NULL),
…
B.col_n = A.col_n IF(A.col_n != '' AND A.col_n != 0 AND A.col_n != NULL)
WHERE A.$uniqueField = B.$uniqueField
n 列(email、firstName、lastName、phone 等)中的任何一个都可以是 $uniqueField(由 PHP 处理),所以我不能使用 insert-on-duplicate-key。
我找到了许多相反的例子(即复制行并跳过目标表中的空字段),包括通过 COALESCE 的一种有前途的方法,但我无法让它工作。
任何帮助将不胜感激......提前致谢!
首先,更新语句的语法不正确。 在 MySQL 中,您需要诸如UPDATE B JOIN A ON ... SET ...
。
说到你想要实现的逻辑,虽然很不清楚,但我怀疑这可以用CASE
表达式来管理:
UPDATE B
JOIN A ON A.$uniqueField = B.$uniqueField
SET
B.col_1 = CASE
WHEN A.col_1 <> '' AND A.col_1 <> '0'
THEN A.col_1
ELSE B.col_1
END,
B.col_2 = CASE
WHEN A.col_2 <> '' AND A.col_2 <> '0'
THEN A.col_2
ELSE B.col_2
END,
...
B.col_N = CASE
WHEN A.col_N <> '' AND A.col_N <> '0'
THEN A.col_N
ELSE B.col_N
END
对于SET
子句中的每一列,如果A
的值不为空、不为null
且不为0
,则查询将其更新为A
的相应值(如果存在此类记录)。 我假设所有列都是字符串数据类型(因此在您的伪代码中是'0'
而不是0
),因为您确实检查了值不是空字符串。
注意:正如 spencer7503 所评论的,无效性检查是多余的:满足两个不等式条件中的任何一个的值保证不为空。
UPDATE B,A
SET B.Col1 = SELECT COALESCE(A.Col1,B.Col1),
B.Col2 =SELECT COALESCE(A.Col2,B.Col2),
...
B.Coln = SELECT COALESCE(A.Coln.B.Coln)
WHERE A.uniquefield = B.uniquefield AND Condition
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.