簡體   English   中英

MySQL:如何通過跳過源表中的空行將行從一個表復制到另一個表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM