Comportement différent de la fonction REPLACE entre Oracle et PostgreSQL

La norme SQL évolue : tirez le meilleur d'un SGBD qui la respecte en écrivant du SQL moderne avec en complément PL/pgSQL, php, java etc.
Répondre
Phil
Administrateur du site
Messages : 191
Enregistré le : mar. 1 sept. 2015 00:38
Localisation : France
Contact :

Comportement différent de la fonction REPLACE entre Oracle et PostgreSQL

Message par Phil » mer. 6 juin 2018 18:36

Merci à Guillaume pour sa question :

"Avec Oracle Database, un replace('chaine', null, 'chaine') renvoie 'chaine' alors qu'avec PostgreSQL un replace('chaine', null, 'chaine') renvoie NULL. Est-il possible d'avoir le même comportement entre les 2 SGBD ?"

Réponse :

Pour avoir le comportement d'Oracle Database pour replace, Il est possible avec PostgreSQL d'utiliser un coalesce sur le ou les arguments pouvant être NULL. Exemple :

Code : Tout sélectionner

select version() ;
                                                        version
-----------------------------------------------------------------------------------------------------------------------
 PostgreSQL 11beta1 (Debian 11~beta1-2.pgdg+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 7.3.0-19) 7.3.0, 64-bit
(1 ligne)

select replace('toto', coalesce(null,''),'a') ;
 replace
---------
 toto
(1 ligne)

select replace('toto', 'o',coalesce(null,'')) ;
 replace
---------
 tt
(1 ligne)

select replace('toto', coalesce(null,''),coalesce(null,'')) ;
 replace
---------
 toto
(1 ligne)


Si le même code est requis, ces coalesce supplémentaires ne gêneront pas Oracle Database :

Code : Tout sélectionner

Connecté à :
Oracle Database 11g Release 11.2.0.4.0 - 64bit Production

select replace('toto', coalesce(null,''),'a') from dual;

REPL
----
toto

select replace('toto', null,'a') from dual;

REPL
----
toto

select replace('toto', 'o',coalesce(null,''))  from dual;

RE
--
tt

select replace('toto', 'o',null) from dual;

RE
--
tt

select replace('toto', coalesce(null,'') ,coalesce(null,'')) from dual;

REPL
----
toto

select replace('toto', null, null)  from dual;

REPL
----
toto

Cdlt. Phil - pgphil.ovh

Répondre