2014-09-18 5 views
11

Ho bisogno di pulire una colonna di stringhe con sia spazi bianchi che tabulazioni inclusi, all'inizio o alla fine delle stringhe (è un disastro!). Voglio mantenere solo uno spazio tra ogni parola. Supponiamo di avere la seguente stringa che comprende tutte le possibili situazioni:PostgeSQL regexp_replace() per mantenere solo uno spazio vuoto

mystring = ' one two three  four ' 
  • 2 spazi bianchi prima 'uno'
  • 1 spazi tra 'uno' e 'due'
  • 4 spaziature tra 'due' e 'tre'
  • 2 linguette dopo 'tre'
  • 1 scheda dopo 'quattro'

Ecco il modo in cui lo faccio:

  1. cancello iniziali e finali spazi bianchi
  2. cancello iniziali e finali schede
  3. sostituisco sia 'spazi bianchi ripetuto almeno due' e le schede da un unico spazio bianco

WITH 

    t1 AS (SELECT' one two three  four '::TEXT AS mystring), 

    t2 AS (SELECT TRIM(both ' ' from mystring) AS mystring FROM t1), 

    t3 AS (SELECT TRIM(both '\t' from mystring) AS mystring FROM t2) 

    SELECT regexp_replace(mystring, '((){2,}|\t+)', ' ', 'g') FROM t3 ; 

alla fine ho ottenere la stringa seguente, che sembra bello, ma ho ancora uno spazio bianco in coda ...

'one two three four ' 

Qualche idea a farlo in modo più semplice e soluzione di questo ultimo numero?

Grazie mille!

+0

Qualsiasi aiuto? Qualcuno ha postato un commento ieri e l'ha cancellato ... Non ho avuto il tempo di guardarlo. Grazie ! – wiltomap

risposta

22
SELECT trim(regexp_replace(mystring, '\\s+', ' ', 'g')) as mystring FROM t1; 

Per le versioni di PostgreSQL 9.1 < si dovrebbe usare \s invece di \\s. Vedi anche https://www.postgresql.org/docs/9.4/static/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS

+3

Su Postgres 9.5 usa '\ s' invece di' \\ s'. – Yarin

+0

Su Postgres 9.4 e 10.0 sembra anche che '\ s' debba essere usato piuttosto che \\ s. –

+0

Grazie! Ma su postgresql 9.4 funziona solo '\ s' –