Je dois nettoyer une colonne de chaîne avec à la fois des espaces et des tabulations, au début ou à la fin des chaînes (c'est un gâchis!). Je veux garder juste un espace entre chaque mot. Disons que nous avons la chaîne suivante qui inclut toutes les situations possibles:
mystring = ' one two three four '
Voici comment je le fais:
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 ;
J'obtiens finalement la chaîne suivante, qui a l'air bien mais j'ai toujours un espace de fuite ...
'one two three four '
Une idée sur le faire d'une manière plus simple et résoudre ce dernier problème?
Merci beaucoup !
SELECT trim(regexp_replace(col_name, '\s+', ' ', 'g')) as col_name FROM table_name;
Ou en cas de mise à jour:
UPDATE table_name SET col_name = trim(regexp_replace(col_name, '\s+', ' ', 'g'));
SELECT trim(regexp_replace(mystring, '\s+', ' ', 'g')) as mystring FROM t1;
Publier une réponse au cas où les gens ne regarderaient pas les commentaires.
Utilisez '\s+'
Pas '\\s+'
Travaillé pour moi.
Cela n'a pas fonctionné pour moi avec trim
et regexp_replace
. Alors je suis venu avec une autre solution:
SELECT trim(
array_to_string(
regexp_split_to_array(' test with many spaces for this test ', E'\\s+')
, ' ')
) as mystring;
First regexp_split_to_array
élimine tous les espaces en laissant des "espaces" au début et à la fin.
-- regexp_split_to_array output:
-- {"",test,with,many,spaces,for,this,test,""}
Quand using array_to_string
tous les ',' deviennent des espaces
-- regexp_split_to_array output ( '_' instead of spaces for viewing ):
-- _test_with_many_spaces_for_this_test_
La garniture est d'enlever la tête et la queue
-- trim output ( '_' instead of spaces for viewing ):
-- test_with_many_spaces_for_this_test