Garniture espaces avec PostgreSQL
J'ai une colonne eventDate
qui contient des espaces. Je suis en train d'essayer de les enlever avec PostgreSQL fonction TRIM()
. Plus précisément, je suis en cours d'exécution:
SELECT TRIM(both ' ' from eventDate)
FROM EventDates;
Cependant, les espaces ne disparaissent pas. De plus, quand je l'ai essayer et ajuster un autre personnage de la date (comme un nombre), il n'a pas de garniture soit. Si je suis en train de lire le manuel correctement, cela devrait fonctionner. Toutes les pensées?
- Êtes-vous sûr de son fait un
space
caractère et pas d'autres, non-visible caractère d'espacement(s)? - Vous êtes correct. Il y a quelques autres non-visible caractère d'espacement.
Vous devez vous connecter pour publier un commentaire.
Il ya beaucoup de différents caractères invisibles. Beaucoup d'entre eux ont la propriété
WSpace=Y
("espace") en Unicode. Mais certains caractères spéciaux ne sont pas considérés comme des "espaces" et n'ont toujours pas visible de la représentation. Les excellents articles de Wikipedia sur les l'espace (la ponctuation) et les espaces devrait vous donner une idée.<rant>Unicode suce à cet égard: l'introduction de beaucoup de caractères exotiques qui desservent principalement d'embrouiller les gens.</rant>
Le standard SQL
trim()
function par défaut, seuls les garnitures le Latin de base de l'espace de caractères (Unicode: U+0020 /ASCII 32). Même avec lartrim()
etltrim()
variantes. Votre appel également à seulement cibles caractère particulier.Utiliser des expressions régulières avec
regexp_replace()
à la place.De fuite
Pour supprimer tous fuite espace blanc (mais pas de blanc espace à l'intérieur de la chaîne):
L'expression régulière a expliqué:
\s
.. expression régulière en classe raccourci pour[[:space:]]
- qui est l'ensemble des caractères d'espacement - voir les restrictions ci-dessous
+
.. 1 ou plusieurs matchs consécutifs$
.. la fin de la chaîneDémo:
Retourne:
Oui, c'est un unique barre oblique inverse (
\
). Les détails dans cette réponse.Leader
Pour supprimer tout premier plan, l'espace blanc (mais pas d'espace blanc à l'intérieur de la chaîne):
^
.. début de chaîneÀ la fois
Pour supprimer les deux, vous pouvez la chaîne ci-dessus appels de fonction:
Ou vous pouvez les combiner en un seul appel avec deux les branches.
Ajouter
'g'
4ème paramètre de remplacer tous les matches, pas seulement la première:Mais qui ne devrait généralement être plus rapide avec
substring()
:\S
.. tout mais espace blanc(?:
re
)
Non-capture de jeu de parenthèses.*
.. une chaîne de 0 à n caractèresOu l'un de ces:
(
re
)
.. La capture de jeu de parenthèsesEfficacement prend le premier caractère non-blanc et tout jusqu'au dernier caractère non-blanc, si disponible.
Espaces?
Il y a un peu plus de les personnages qui ne sont pas classées comme des "espaces" dans Unicode donc pas contenue dans la classe de caractères
[[:space:]]
.Ces imprimer invisible glyphes dans pgAdmin pour moi: "mongol voyelle", "zero width space", "zéro de la largeur de non-menuisier", "zéro largeur menuisier":
Deux de plus, l'impression que visible glyphes dans pgAdmin, mais invisible dans mon navigateur: "mot de menuisier", "zéro de la largeur de l'espace insécable":
En fin de compte, si les caractères sont rendus invisibles ou non dépend aussi de la police utilisée pour l'affichage.
Pour supprimer tous ces ainsi, remplacer
'\s'
avec'[\s\u180e\u200B\u200C\u200D\u2060\uFEFF]'
ou'[\s]'
(note de fuite des caractères invisibles!).Exemple, au lieu de:
utilisation:
ou:
Limites
Il y a aussi le De caractères Posix classe
[[:graph:]]
censés représenter des "caractères visibles". Exemple:Il fonctionne de manière fiable pour les caractères ASCII dans chaque installation (où il se résume à
[\x21-\x7E]
), mais au-delà de que vous avez actuellement (incl. pg 10) dépendent de l'information fournie par l'OS sous-jacent (à définirctype
) et éventuellement des paramètres régionaux.À proprement parler, c'est le cas pour chaque référence à une classe de caractère, mais il semble être plus en désaccord avec le moins couramment utilisés comme graphique. Mais vous pouvez avoir à ajouter plus de caractères à la classe de caractères
[[:space:]]
(abréviation\s
) pour attraper tous les espaces. De la forme:\u2007
,\u202f
et\u00a0
semblent également manquer pour @XiCoN JFS.Le manuel de:
Gras c'est moi qui souligne.
Également note de cette limitation a été fixe avec Postgres 10:
SELECT regexp_replace(regexp_replace(eventdate, '^\s+', ''), '\s+$', '') FROM eventdates;
travail dépouiller de tout premier plan, et les espaces de fin?trim()
. Sinon, envisagez l'ajout de bits ci-dessus.SELECT regexp_replace(regexp_replace(eventdate, '^(\s|\u00a0|\ufeff|\u2007|\u180e|\u202f)+', ''), '(\s|\u00a0|\ufeff|\u2007|\u180e|\u202f)+$', '') FROM eventdates;
\u00a0
est déjà contenue dans le\s
et vous pouvez combiner le tout dans une seule classe de personnage. J'ai mis à jour afin de clarifier un peu plus.\s
ne pas attraper\u00a0
, c'est pourquoi je l'ai ajouté à la regex. Merci pour la clarification de cette super réponse!Il devrait fonctionner de la façon dont vous êtes la manipulation, mais c'est difficile à dire sans connaître la chaîne de caractères.
Si vous êtes le parage des espaces, vous pouvez utiliser la forme plus concise:
C'est un petit test pour vous montrer que cela fonctionne.
Dites-nous si ça marche!
Si votre espace est plus que juste le
space
méta valeur que vous aurez besoin d'utiliserregexp_replace
:Dans l'exemple ci-dessus, je suis la délimitation de la valeur de retour dans
(
et)
de sorte que vous pouvez facilement voir que la regex pour remplacer travaille dans un psql invite. De sorte que vous aurez envie de supprimer ceux qui sont dans votre code.Il donne:
devosystem