Vous n'êtes pas identifié(e).

#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é smile


Guillaume.

Hors ligne

Pied de page des forums