Bonjour,
j'ai une table destination n'acceptant les valeurs nulles; vaut-il mieux faire
ou bien passer le champ de la table de destination en non null default 0 ?Code:INSERT INTO MATABLE_DEST SELECT ISNULL(MONCHAMP,0) FROM MATABLE_SRC
merci
Version imprimable
Bonjour,
j'ai une table destination n'acceptant les valeurs nulles; vaut-il mieux faire
ou bien passer le champ de la table de destination en non null default 0 ?Code:INSERT INTO MATABLE_DEST SELECT ISNULL(MONCHAMP,0) FROM MATABLE_SRC
merci
J'imagine que la colonne en question n'est pas la seule de la table, et que l'insertion concerne d'autres colonnes. A partir de là, le but étant de mettre une valeur si elle est non nulle, il faut passer par COALESCE. Mettre en "default 0" n'aurait pour seul effet que de permettre à des insertions ne mentionnant pas cette colonne d'y caser 0. Je doute que ça réponde au besoin :aie:
Par contre, si la colonne cible n'accepte pas les valeur null, peut-être y a-t-il une bonne raison à la différence d'avec la table source ; potentiellement il faut envisager l'hypothèse que les lignes de source avec des valeurs null dans cette colonne ne devraient pas être insérées dans la table destination. Auquel cas, rajouter la condition :
Citation:
INSERT INTO MATABLE_DEST SELECT MONCHAMP FROM MATABLE_SRC
WHERE MONCHAMP IS NOT NULL
merci Rei Ichido,
en fait les valeurs possiblement nulles viennent du fait que la requête select contient un LEFT OUTER JOIN donc, si pas de jointure, valeurs nulles pour certains champs (en général des montants); c'est pour un Datamart
ensuite on aggrège d'où la valeur 0 et non la valeur NULL. C'est pour cette raison que l'on a toujours un 0 si null.
la requête est du type
pourquoi le coalesce plutôt que le ISNULL ?Code:
1
2
3
4
5 INSERT INTO table3 (ch1,ch2) SELECT a.champ1,ISNULL(b.champ2,0) from table1 a left outer join table2 b on a.pk1=b.pk2 where a.champ3='toto'
ISNULL(MONCHAMP,0) n'est pas plus rapide que COALESCE(MONCHAMP,0) ?
Je n'ai jamais fait de comparaison entre les deux. Mais je préfère utiliser COALESCE parce que :
- cela permet d'avoir plusieurs valeurs à la suite, c'est plus lisible dans ce cas
- c'est une fonction générique SQL, et donc pas besoin de switcher avec d'autres fonctions spécifiques en passant de SQL Server à Oracle ou PostGre.