PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 19/10/2009 18:17:39

FNo
Membre

Fonction Replace(text,text,text)

Bonjour,
Fraîchement inscrit et déjà une question tongue

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 wink

Hors ligne

#2 19/10/2009 23:27:47

gleu
Administrateur

Re : Fonction Replace(text,text,text)

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

#3 20/10/2009 00:30:45

Re : Fonction Replace(text,text,text)

gleu a écrit :

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

#4 20/10/2009 08:29:10

Marc Cousin
Membre

Re : Fonction Replace(text,text,text)

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

#5 20/10/2009 11:11:56

Re : Fonction Replace(text,text,text)

Marc Cousin a écrit :

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

#6 20/10/2009 13:23:12

Marc Cousin
Membre

Re : Fonction Replace(text,text,text)

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

#7 20/10/2009 13:36:24

FNo
Membre

Re : Fonction Replace(text,text,text)

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

#8 20/10/2009 20:11:16

gleu
Administrateur

Re : Fonction Replace(text,text,text)

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

#9 21/10/2009 07:48:30

Re : Fonction Replace(text,text,text)

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

Pied de page des forums