Question

J'ai une colonne dans ma base de données (un indicateur) de type varchar (1) qui est remplie par Y ou par NULL (c'est comme ça, pas dans mon contrôle).

Dans SQL Server, en effectuant un ordre croissant par requête, la valeur NULL est classée en haut. Ce comportement doit-il être cohérent pour Oracle et DB2?

Si, au lieu de cela, j'ai une COALESCE sur la colonne pour m'assurer qu'elle n'est pas nulle dans la requête, est-ce que je risque de rencontrer des problèmes de performances (dus aux analyses de table et autres)?

MODIFIER

La requête doit être cohérente sur les 3 bases de données, sinon je devrai la manipuler en code, d’où ma pensée d’utiliser la fonction COALESCE

MODIFIER

J'ai choisi Pax comme réponse, car elle traitait des deux parties de la question et offrait une solution de contournement utile, cependant, grâce à me.yahoo.com/a/P4tXrx pour le lien vers ici

Était-ce utile?

La solution

Je sais pertinemment que DB2 Express et DB2 (au moins jusqu'à la version 8) ne prend pas en charge la clause NULLS FIRST .

Si vous souhaitez une solution portable, vous devrez peut-être opter pour une solution telle que:

select * from tbl where fld is null
    union all select * from tbl where fld is not null

Je pense que le résultat de l'union (du moins dans DB2, vous devez vérifier les autres) est garanti pour être commandé correctement.

La coalesce aura des conséquences sur les performances, car vous exécutez une fonction pour chaque ligne renvoyée. Cependant, cela dépend du nombre de lignes de la base de données.

Vous devrez peut-être recourir à deux requêtes codées dans deux jeux d’enregistrements différents, puis les traiter dans l’ordre.

EDIT: Je viens de vérifier le standard SQL et il n’est pas garanti que les requêtes jointes à un UNION ALL soient séquencées; ils pourraient être mélangés. Il semble donc que vous deviez peut-être recourir à du code exécutant deux requêtes différentes, comme mentionné ci-dessus.

Autres conseils

  

Dans SQL Server, en effectuant un ordre croissant par requête, la valeur NULL est classée en haut. Ce comportement doit-il être cohérent pour Oracle et DB2?

Apparemment, il s'agit d'un nouvel arrivant relatif à la norme .

  

La fonctionnalité principale du standard SQL ne définit pas explicitement un ordre de tri par défaut pour les valeurs NULL. Avec l'extension SQL: 2003 T611, "Opérations OLAP élémentaires", les valeurs NULL peuvent être triées avant ou après toutes les valeurs de données à l'aide des clauses NULLS FIRST ou NULLS LAST de la liste ORDER BY, respectivement. Cependant, tous les fournisseurs de SGBD n'implémentent pas cette fonctionnalité. Les fournisseurs qui n'implémentent pas cette fonctionnalité peuvent spécifier différents traitements pour le tri nul dans le SGBD.

Dans Oracle, vous pouvez le faire:

ORDER BY value NULLS FIRST 

ou

ORDER BY value NULLS LAST

Essayez-le sur SQL Server

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top