Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
je souhaite réaliser un update d'une date depuis une autre table sauf que dans mes conditions where, il ce peut que des chams soit Null,
ma requette sera du genre :
update table1 set champ1 = table2.champ1
from table2
where table1.champx = table2.champx
and table1.champy = table2.champy
champx et champy peuvent être null, et comme il n'est pas possible de comparer deux valeurs null,
j'ai pensé à deux solutions,
faire un :
update table1 set champx = '' where champx is null ;
pour l'ensemble des champs qui peuvent être null
ou encore :
update table1 set champ1 = table2.champ1
from table2
where concat('',table1.champx) = tconcat('',able2.champx)
and concat('',table1.champy) = concat('',table2.champy)
à votre avis,Y a t il une autre soluton ?
si non laquelle des deux est la plus pertinante ?
d'avance merci
Dernière modification par youssef (12/02/2014 13:14:27)
Hors ligne
Les deux solutions que vous proposez n'en sont pas. Si les champs valent NULL, je ne vois pas pourquoi vous devriez les mettre à une chaîne vide. Ce n'est pas du tout la même chose.
Quant à la deuxième solution, elle ne foncitonnera pas. Concaténer une chaîne à une valeur NULL donne une valeur NULL.
Une solution est de passer par coalesce :
update table1 set champ1 = table2.champ1
from table2
where coalesce(table1.champx, '') = coalesce(table2.champx, '')
and coalesce(table1.champy, '') = coalesce(table2.champy, '')
Simple à lire, rapide à écrire... mais pas performant vu qu'on ne peut pas utiliser les index. Plus performant :
update table1 set champ1 = table2.champ1
from table2
where (table1.champx IS NULL OR table2.champx IS NULL OR table1.champx=table2.champx)
and (table1.champy IS NULL OR table2.champy IS NULL OR table1.champy=table2.champy)
Guillaume.
Hors ligne
Merci Guillaume pour ta réponse,
j'opte pour la solution la plus performante , sauf que j'ai l'impression qu'il faut un AND au lieu d'un OR
UPDATE table1
SET champ1 = table2.champ1
FROM
table2
WHERE
(
(
table1.champx IS NULL
AND table2.champx IS NULL
)
OR(table1.champx = table2.champx)
)
AND(
(
table1.champy IS NULL
AND table2.champy IS NULL
)
OR(table1.champy = table2.champy)
)
une p'tite remarque
SELECT concat('valeur',NULL)
retourne valeur
----
SELECT 'valeur'||NULL
retourne NULL
Merci :-)
Dernière modification par youssef (12/02/2014 13:34:42)
Hors ligne
Ah oui, je m'étais planté sur la requête et sur concat. Désolé
Guillaume.
Hors ligne
Pages : 1