MySQL: Как скопировать строку из одной таблицы в другую, пропуская пустые строки в исходной таблице? - PullRequest
0 голосов
/ 17 февраля 2020

Может ли кто-нибудь помочь мне превратить этот псевдокод PHP / MySQL в рабочий 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, но Я не мог заставить это работать.

Любая помощь будет высоко ценится ... заранее спасибо!

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Начнем с того, что синтаксис вашего оператора обновления неверен. В MySQL вам нужно что-то вроде UPDATE B JOIN A ON ... SET ....

Когда дело доходит до логики c, которую вы хотите реализовать, хотя и не совсем понятно, я подозреваю, что этим можно управлять с помощью выражений 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 (если такая запись существует), если значение в A не является пустым не null и не 0. Я предположил, что все столбцы имеют строковый тип данных (следовательно, '0' вместо 0 в вашем псевдокоде), так как вы проверяете, что значения не являются пустыми строками.

Примечание: как указано в spencer7503, проверка на недействительность является избыточной: значения, которые удовлетворяют любому из двух условий неравенства, гарантированно не равны нулю.

0 голосов
/ 18 февраля 2020
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
...