Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Fraîchement inscrit et déjà une question
Je ne sais pas si le problème a déjà été évoqué (rien trouvé par la recherche) au sujet de la fonction text "replace". Je voulais un traitement particulier et je n'ai pas été déçu! Voici un exemple :
select replace('ABCD','E',null)
Je m'attendais à la chaîne ABCD mais en fait, on obtient null en retour quelque soit le test. Pourquoi? On peut bien affecter null à un type text pourtant.
Si quelqu'un sait où je commets une erreur de raisonnement, merci à lui de me remettre sur le droit chemin
Hors ligne
La seule explication qui me vienne en tête est que la majorité des procédures stockées sont codées de façon à ce que NULL soit renvoyé si un des arguments est NULL.
Guillaume.
Hors ligne
La seule explication qui me vienne en tête est que la majorité des procédures stockées sont codées de façon à ce que NULL soit renvoyé si un des arguments est NULL.
Oui mais là je trouve que cela relève du bug...
AMHA replace('ABCD','E',null) devrait renvoyer 'ABCD', et ne renvoyer NULL que si text1 contient 'E'...
Hors ligne
c'est pas vraiment un cas d'utilisation normal de replace : on ne peut pas remplacer un bout de la chaine en entrée par null…
il vaudrait mieux faire un case avec condition sur la chaine (quelque chose du genre case when chaine like '%E%' then NULL else chaine).
Marc.
Hors ligne
c'est pas vraiment un cas d'utilisation normal de replace : on ne peut pas remplacer un bout de la chaine en entrée par null…
il vaudrait mieux faire un case avec condition sur la chaine (quelque chose du genre case when chaine like '%E%' then NULL else chaine).
Ça je suis bien d'accord.
Mais je trouve quand même que dans ce cas là, le comprtement de replace() est... ésotérique.
Hors ligne
Pas vraiment. Il est tout à fait logique que la fonction soit déclarée comme stricte : si un des paramètres est null, elle retourne null directement, sans rentrer à l'intérieur. L'appel de cette fonction avec n'importe lequel de ses paramètres à null est absurde.
Marc.
Hors ligne
Evidemment, j'ai codé en réalité avec un case, mais je voulais simplifier la syntaxe de ma requête déjà bien lourde. Dans mon exemple, je voulais détourner la fonction pour qu'elle retourne la chaîne ou null. J'ai bien conscience qu'insérer un null dans une chaîne est absurde. Mais j'avoue tout de même être surpris.
Merci à vous, je suis rassuré sur le fait qu'il n'y a pas une réponse si simple que cela.
Dernière modification par FNo (20/10/2009 14:16:35)
Hors ligne
Je suis d'accord avec Hervé, c'est quand même perturbant. Néanmoins, c'est logique et je ne suis pas d'accord avec lui que ce soit un bug. La déclaration de la fonction indique qu'il s'agit d'une fonction strict, donc elle est conforme à sa déclaration, donc pas de bug. Mais c'est vraiment pas intuitif.
Guillaume.
Hors ligne
ah oui j'avais pas fait gaffe à la déclaration STRICT.
Faudrait peut-être le signaler dans le tableau 9.6 de la doc.
Hors ligne
Pages : 1