Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Petit problème concernant le tri des valeurs NULL. En effet celles-ci sont toujours placées au début que le tri soit ascendant ou descendant !!
Ce qui est bizarre c'est que ça fonctionne bien avec ASE iSQL mais pas dans mon appli...
Est-ce qu'il existe une option de configuration du driver pour dire comment traiter les NULL ?
Sinon je fais ça mais je dois retoucher toutes les requêtes !
SELECT COALESCE(nom, ''), COALESCE(prenom, '') ...
PB 11.5 - ASE 12.5.4
Fab
Hors ligne
It's not a bug, it's a feature
Sort method (DataWindows) a écrit:
When you sort a DataWindow on a specified column, rows with null data remain at the top, regardless of whether you choose ascending or descending order for your sort criteria.
Quant à ASE isql (je suis fan, c'est un très bon produit !), il substitue à posteriori les null par la chaîne que tu spécifies dans les options (page ResultSet).
Au final, je crains qu'il n'y ait pas de solution propre et élégante à ton problème...
Hors ligne
Merci, ouaip ben je la trouve pas cool du tout cette feature
A part COALESCE voyez-vous une autre solution ?
Fab
Hors ligne
J'ai un problème avec la solution COALESCE. En effet comment convertir un nombre NULL en texte.
Disons que j'ai une colonne qui contient des nombres dont certains sont NULL, mais je veux afficher une chaîne vide à la place (afin qu'elle soit correctement triée)
SELECT COALESCE(nom, '') ...
Fonctionne car nom est VARCHAR, mais:
SELECT COALESCE(age, '') ...
Ne fonctionne pas car age est un nombre mais '' pas !
Et bien entendu je ne veux pas faire:
SELECT COALESCE(age, -1) ...
Si vous avez des pistes je suis preneur...
Fab
Hors ligne
En Oracle, il y a la fonction NVL, mais je ne crois pas que l'équivalent existe en ASE
Hors ligne
Non elle n'existe pas mais il y a ISNULL qui fait pareil, mais en fait ça fait pareil: Implicit convertion from datatype VARCHAR to INT is not allowed...
Hors ligne
Bonjour,
Je suppose que dans le SELECT COALESCE(age, -1) c'est la présence à l'affichage du -1 qui te gêne.
Tu peux toujours utiliser une colonne pour l'affichage et utiliser une autre colonne que tu n'affiches pas pour le tri :
SELECT age as display, COALESCE(age, -1) as tri
Sinon, tu peux également mettre une formule sur la colonne sur la propriété visible pour ne pas afficher le contenu lorsque la valeur est -1.
Autre suggestion, tu peux également faire le tri sur une colonne masquée de type computed field : if(IsNull(age), -1, age) et afficher la colonne age sans modification.
Hors ligne
thefab a écrit:
J'ai un problème avec la solution COALESCE. En effet comment convertir un nombre NULL en texte.
Si tu cherches à renseigner une même colonne de ton jeu de résultat avec des valeur de type varchar ou int selon l'humeur, tu peux oublier de suite, c'est impossible : SQL est un langage à typage fort. À la rigueur, tu peux tenter un truc du genre :
SELECT isnull(convert(varchar, age), '') AS age_string
Mais ce n'est pas bien propre, et tu perds toute possibilité de tri naturel en fonction de la valeur numérique.
La meilleure piste me semble le computed field additionnel façon buck. Ton SQL reste propre, et avec un peu de chance tu auras peu de modifications à faire dans les scripts PB. Si tu t'autorises un tri multicritères, un computed field avec l'expression "if(isnull(age), 1, 0)" te permettra de placer à volonté les âges null en début ou en fin de liste.
Hors ligne