2009-04-10 18 views
1

Quel est le moyen de trouver la sous-chaîne correspondant exactement dans la chaîne donnée dans le serveur Microsoft SQL?Fonction pour trouver la correspondance exacte dans Microsoft SQL Server

Par exemple, dans la chaîne '0000020354', je souhaite trouver '20354'. Bien sûr, il doit être un match exact. J'ai essayé d'utiliser CHARINDEX (@providerId, external_prv_id)> -1, mais le problème avec CHARINDEX est qu'il me donne l'index dès qu'il trouve la première correspondance.

Fondamentalement, je cherche une fonction comme indexOf ("") dans Microsoft SQL SERVER.

+0

Voulez-vous dire "2035" (pas "2034") dans "0000020354"? Vous voudrez peut-être modifier la question. – MattH

Répondre

1

En supposant @ProviderId est un VARCHAR

Vous pouvez simplement utiliser LIKE:

SELECT Id FROM TableName WHERE Column LIKE '%' + @ProviderId + '%' 

qui renverra les lignes où Column contient 2034.

Et si vous ne voulez pas utiliser LIKE, Vous pouvez utiliser PATINDEX:

SELECT Id FROM TableName WHERE PATINDEX('%' + @ProviderId + '%', Column) > 0 

Ce qui renvoie la position de départ de toute correspondance trouvée.

+0

cette valeur est toujours dyanmic. Je ne connais pas cette valeur à l'avance – Shiva

+0

ce nombre est juste un exemple – Shiva

+0

Votre question est source de confusion, mais je pense que PATINDEX est ce que vous voulez. Il n'y a aucun problème à paramétrer le 2034 Sean écrit. Branchez-le à l'endroit où vous avez utilisé CHARINDEX ci-dessus. – Mark

0

Quelles sont les données que vous stockez? Il semble qu'un autre type de stockage (par exemple un tableau séparé) soit plus approprié.


Ahh, 2034 était une faute de frappe. Ce que je ne comprends pas de votre question, c'est que vous dites que vous avez besoin de la correspondance exacte. Si CHARINDEX renvoie une valeur non nulle pour '20354', vous savez qu'il correspond à '20354'. Si vous ne savez pas ce qu'est @providerId, renvoyez-le dans votre requête avec le résultat de CHARINDEX. De même, si vous voulez external_prv_id, comprendre que, par exemple:

SELECT external_prv_id, CHARINDEX(@providerId, external_prv_id) 
     WHERE CHARINDEX(@providerId, external_prv_id) > 0 

(Notez que CHARINDEX retour 0 signifie qu'il était pas trouvé.)

Si vous voulez dire en fait que '20354' pourrait inclure des caractères génériques, vous avez besoin de PATINDEX.

0

La substance LIKE% VAL% sera trop large, par ex. la base de données contient 00000et vous cherchez 1234 vous allez tirer cette ligne, ce qui est ce que l'OP n'a pas l'intention (si je comprends bien la partie "EXACT" correctement).

Ce que vous voulez est une expression régulière qui fait quelque chose comme: un nombre quelconque de zéros suivi par la correspondance et la fin de la ligne.

De cette question, nous savons comment découper des zéros non significatifs: Better techniques for trimming leading zeros in SQL Server?

SUBSTRING(str_col, PATINDEX('%[^0]%', str_col+'.'), LEN(str_col)) 

Ainsi, moissonneuse-batteuse avec votre requête, et vous pouvez faire quelque chose comme ce qui suit:

WHERE SUBSTRING(external_prv_id, PATINDEX('%[^0]%', external_prv_id+'.'), LEN(external_prv_id)) = '12345' 

Bien sûr , la meilleure (meilleure?) solution serait de les stocker comme INTEGERS afin que vous obteniez l'indexabilité complète et ne devez pas déblayer avec toute cette merde.Si vous avez vraiment besoin de stocker la chaîne exacte, alors vous avez deux options:

  • stocker les résultats entier normalisé dans une autre colonne et l'utiliser pour toutes les requêtes internes
  • toujours stocker un entier mais pad avec des zéros à la demande (mon vote)
Questions connexes