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. p>
7 Réponses :
Je ne sais pas comment faire cela, mais les fonctions d'expression régulières telles que regexp_matches code>,
regexp_replace code> et
regexp_split_to_array code> peut être un itinéraire alternatif résoudre votre problème. p>
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
Bien ...
Select length('2010-####-3434') - position('#' in reverse_string('2010-####-3434')) + 1;
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; $$; code>
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 $); $$; code> - donc
last_phosition ('thomas omas omas', 'OMA') code> donne 11
Ce n'est pas une chaîne inverse, son inverse ()
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 ( une solution plus robuste impliquerait PL / PGSQL, comme la réponse de RFusca. P> P> . $ ^ () [] * + code>)
Dans le cas où char = '.' code>, une évasion est nécessaire. Donc, la fonction peut être écrite:
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 pour la première position, il est plus facile d'utiliser P> select position('#' in '2010-####-3434');
array_positions code> à l'aide de basique Fonctions de tableau postgreSQL Nous appelons string_to_array () code>, puis alimentez-le sur Array_Positions () CODE> TRAY_POSITIONS (string_to_array (Str, null ), c) code> p> xxx pré> h1>
Mon exemple:
reverse(substr(reverse(newvalue),0,strpos(reverse(newvalue),',')))
Voir aussi: wiki.postgresql.org/wiki/strposrev
Voir ma réponse pour comment faire cela avec un 9.5+