Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 12/02/2014 13:08:27
- youssef
- Membre
Update avec comparaison de valeurs NULL
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
#2 12/02/2014 13:18:57
- gleu
- Administrateur
Re : Update avec comparaison de valeurs NULL
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
#3 12/02/2014 13:34:16
- youssef
- Membre
Re : Update avec comparaison de valeurs NULL
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
#4 12/02/2014 23:07:01
- gleu
- Administrateur
Re : Update avec comparaison de valeurs NULL
Ah oui, je m'étais planté sur la requête et sur concat. Désolé
Guillaume.
Hors ligne
Pages : 1