11
votes

Comment trouver les premières et dernières occurrences d'un caractère spécifique à l'intérieur d'une chaîne dans PostgreSQL

Je veux trouver les premières et les dernières occurrences d'un caractère spécifique à l'intérieur d'une chaîne. À titre d'exemple, envisagez une chaîne nommée "2010 - #### - 3434" et supposons que le caractère recherché est "#". La première occurrence de hachage à l'intérieur de la chaîne est à 6ème position et la dernière occurrence est à la 9ème position.


7 Réponses :


2
votes

Je ne sais pas comment faire cela, mais les fonctions d'expression régulières telles que regexp_matches , regexp_replace et regexp_split_to_array peut être un itinéraire alternatif résoudre votre problème.


2 commentaires

Je suppose que c'est une sorte de modèle qui doit être rempli. Dans ce cas, Regexp_replace ("# +", 'ABCD') remplacera le #### avec ABCD. Le signe '+' signifie correspondant à 1 ou plus du personnage avant de cela. Il est tout expliqué en détail ici: développeur.postgresql. org / pgdocs / postgres / ...


Split_Part (chaîne, délimiteur, occurrence) pourrait aider



28
votes

Bien ...

Select length('2010-####-3434') - position('#' in reverse_string('2010-####-3434')) + 1;


3 commentaires

En tant que fonction Créer ou remplacer la fonction Last_Position (texte, char) renvoie la langue d'entier SQL comme $$ Sélectionnez la longueur (1 $) - Position (2 $ en sens inverse (1 $)) + 1; $$;


Je modifie légèrement la fonction de Mfarid pour le faire avec une sous-chaîne plus longue: Créer ou remplacer la fonction Last_Position (texte, texte) Renvoie la langue d'entier SQL comme $$ Sélectionnez la longueur ($ 1) - Position (2 $) en sens inverse (1 $) )) - longueur (2 $); $$; - donc last_phosition ('thomas omas omas', 'OMA') donne 11


Ce n'est pas une chaîne inverse, son inverse ()



3
votes

Cette fonction PURE SQL fournira la dernière position d'un caractère à l'intérieur de la chaîne, de compter à partir de 1. Il renvoie 0 si non trouvé ... mais (Big Disclaimer) Il se casse si le personnage est un métacaracter Regex ( . $ ^ () [] * + ) xxx

une solution plus robuste impliquerait PL / PGSQL, comme la réponse de RFusca.


0 commentaires

5
votes

Dans le cas où char = '.' , une évasion est nécessaire. Donc, la fonction peut être écrite: xxx


0 commentaires

0
votes

Une autre façon de compter la dernière position consiste à la fente de la chaîne à la matrice par Delimètre est égale au caractère nécessaire, puis soustraction de la longueur des caractères. Pour le dernier élément de la longueur de la chaîne entière xxx pré>

pour la première position, il est plus facile d'utiliser P>

select position('#' in '2010-####-3434');


0 commentaires

4
votes

9.5+ avec array_positions

à l'aide de basique Fonctions de tableau postgreSQL Nous appelons string_to_array () , puis alimentez-le sur Array_Positions () TRAY_POSITIONS (string_to_array (Str, null ), c) xxx


0 commentaires

4
votes

Mon exemple:

reverse(substr(reverse(newvalue),0,strpos(reverse(newvalue),',')))


0 commentaires