2016-09-10 1 views
0

Je dois supprimer '.0' à la fin de la chaîne, mais j'ai quelques problèmes.Postgres: regexp_replace & trim

Dans PG 8.4 J'ai cette expression et son a été travaillé très bien.

select regexp_replace('10.1.2.3.0', '(\\\\.0)+$', ''); 

et le résultat était

'10 .1.2.3' - bon résultat.

Mais après PG a été mis à jour 9.x résultat version est

'10 .1.2.3.0' - la chaîne d'entrée et son ok pas.

Aussi j'ai essayé d'utiliser la fonction garniture

il ce cas, il est ok

select trim('.0' from '10.1.2.3.0'); 
résultat

est '10 .1.2.3' - ok

mais quand je avoir 10 à la fin du code, j'ai un résultat inattendu

select trim('.0' from '10.1.2.3.10.0'); 

ou

select trim('.0' from '10.1.2.3.10'); 
résultat

est 10.1.2.3.1 - 0 est rognée de 10

Quelqu'un peut-il me suggérer une solution et d'expliquer ce qui ne va pas avec garniture fonction et ce qui a été changé en regexp_replace dans les dernières versions?

Répondre

1

Je vous conseille de faire quelque chose comme ceci:

select (case when col like '%.0' then left(col, length(col) - 2) 
      else col 
     end) 

Cela fonctionne dans toutes les versions de Postgres et vous n'avez pas à vous soucier de l'analyse syntaxique expression régulière.

En ce qui concerne la version d'expression régulière, ces deux travaux pour moi (sur les versions récentes de Postgres):

select regexp_replace('10.1.2.3.0', '(\.0)+$', ''); 
select regexp_replace('10.1.2.3.0', '([.]0)+$', ''); 

Je soupçonne que le problème avec la version précédente est la chaîne analyse syntaxique avec le caractère d'échappement backslash - - vous pouvez utiliser des crochets à la place de la barre oblique inverse et le modèle devrait fonctionner dans n'importe quelle version.

+0

Merci beaucoup! :) Le problème est avec le caractère d'échappement backslash et son comportement a été changé entre les versions. – Dumitru