138 votes

Trouver l'indice de la dernière occurrence d'une sous-chaîne à l'aide de T-SQL

Est-il un moyen simple de trouver l'indice de la dernière occurrence d'une chaîne à l'aide de SQL? Je suis à l'aide de SQL Server 2000 à l'instant. En gros, j'ai besoin de la fonctionnalité de la .NET System.String.LastIndexOf méthode fournit. Un peu googler a révélé ce - Fonction Pour Récupérer les Derniers Index - mais qui ne fonctionne pas si vous passez dans un "texte" expression de la colonne. D'autres solutions trouvées ailleurs le travail, aussi longtemps que le texte que vous recherchez est de 1 caractère.

Je vais probablement avoir à faire cuire une fonction. Si je le fais, je vais le poster ici afin de vous des gens peuvent la regarder et peut-être faire usage de.

187voto

Philip Kelley Points 19032

De façon simple? Non, mais j'ai utilisé l'inverse. Littéralement.

En avant routines, pour trouver cours de la dernière occurence d'une chaîne de caractères, j'ai utilisé le REVERSE() de la fonction, suivi CHARINDEX, suivi de nouveau par l'INVERSE de restaurer l'ordre original. Par exemple:

SELECT
   mf.name
  ,mf.physical_name
  ,reverse(left(reverse(physical_name), charindex('\', reverse(physical_name)) -1))
 from sys.master_files mf

montre comment extraire la base de données des noms de fichiers à partir de leur "physique" de noms, n'importe comment profondément imbriqués dans des sous-dossiers. Cela ne rechercher qu'un seul caractère (la barre oblique inverse), mais vous pouvez construire sur cette pour de plus longues chaînes de recherche.

Le seul inconvénient est que je ne sais pas comment cela fonctionne sur les types de données TEXTE. J'ai été sur SQL 2005 depuis quelques années maintenant, et je ne suis plus familier avec l'utilisation du TEXTE -- mais il me semble que vous pourriez utiliser à GAUCHE et à DROITE?

Philip

113voto

Mptje Points 301

La façon la plus simple est....

REVERSE(SUBSTRING(REVERSE([field]),0,CHARINDEX('[expr]',REVERSE([field]))))

64voto

Binoj Antony Points 7519

À l'aide d'une fonction de beaucoup de temps qui est préjudiciable à la performance, code ci-dessous est plus efficace.

DECLARE @FilePath VARCHAR(50) = 'My\Super\Long\String\With\Long\Words'
DECLARE @FindChar VARCHAR(1) = '\'

-- Shows text before last slash
SELECT LEFT(@FilePath, LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath))) AS Before
-- Shows text after last slash
SELECT RIGHT(@FilePath, CHARINDEX(@FindChar,REVERSE(@FilePath))-1) AS After
-- Shows the position of the last slash
SELECT LEN(@FilePath) - CHARINDEX(@FindChar,REVERSE(@FilePath)) AS LastOccuredAt

37voto

gbn Points 197263

Vous êtes limité à petite liste de fonctions pour le type de données texte.

Tout ce que je peux suggérer, c'est de commencer avec PATINDEX, mais travailler à rebours à partir de DATALENGTH-1, DATALENGTH-2, DATALENGTH-3 etc jusqu'à ce que vous obtenez un résultat ou à la fin jusqu'à zéro (DATALENGTH-DATALENGTH)

C'est vraiment quelque chose que SQL Server 2000 ne peuvent tout simplement pas gérer.

Edit, pour les autres réponses: INVERSE n'est pas sur la liste des fonctions qui peuvent être utilisées avec les données de texte dans SQL Server 2000

6voto

mark brito Points 31
REVERSE(SUBSTRING(REVERSE(ap_description),CHARINDEX('.',REVERSE(ap_description)),len(ap_description)))  

a mieux fonctionné pour moi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X