2009-04-10 3 views
1

Wie finde ich die genau übereinstimmende Teilzeichenfolge in der angegebenen Zeichenfolge in Microsoft SQL Server?Funktion zum Finden der genauen Übereinstimmung in Microsoft SQL Server

Zum Beispiel, in der Zeichenfolge '0000020354' möchte ich '20354' finden. Natürlich muss es genau stimmen. Ich habe versucht, CHARINDEX (@providerId, external_prv_id)> -1 zu verwenden, aber das Problem mit CHARINDEX ist, dass es mir den Index gibt, sobald es die erste Übereinstimmung findet.

Grundsätzlich suche ich nach Funktion wie IndexOf ("") in Microsoft SQL SERVER.

+0

Meinst du finden "2035" (nicht "2034") in "0000020354"? Vielleicht möchten Sie die Frage bearbeiten. – MattH

Antwort

1

@ProviderId Unter der Annahme ist ein VARCHAR

Sie nur LIKE verwenden:

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

welche Zeilen zurück, wo Column enthält 2034

Und wenn Sie nicht LIKE verwenden wollen, Sie können PATINDEX:

verwenden 210

Gibt die Startposition eines gefundenen Spiels zurück.

+0

Dieser Wert ist immer dyanmisch. Ich kenne diesen Wert nicht im Voraus – Shiva

+0

diese Zahl ist nur ein Beispiel – Shiva

+0

Ihre Frage ist verwirrend, aber ich denke, PATINDEX ist, was Sie wollen. Es gibt kein Problem mit der Paramaterisierung des Sean's von 2034. Stecken Sie es dort ein, wo Sie CHARINDEX oben verwendet haben. – Mark

0

Welche Daten speichern Sie? Es klingt, als ob ein anderer Speichertyp (z. B. eine separate Tabelle) geeigneter wäre.


Ahh, 2034 war ein Tippfehler. Was ich von Ihrer Frage nicht verstehe ist, dass Sie sagen, dass Sie genau die Übereinstimmung brauchen. Wenn CHARINDEX für '20354' ungleich Null zurückgibt, wissen Sie, dass es '20354' entspricht. Wenn Sie nicht wissen, was @providerId ist, geben Sie das in Ihrer Abfrage zusammen mit dem Ergebnis von CHARINDEX zurück. Und falls Sie external_prv_id wollen, beinhalten, dass, zum Beispiel:

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

(dass CHARINDEX Hinweis Rückkehr 0 bedeutet, es war nicht gefunden.)

Wenn Sie tatsächlich bedeuten, dass '20354' Platzhalter enthalten könnte, Sie brauchen PATINDEX.

0

Das LIKE% VAL% Zeug wird übermäßig breit sein, z.B. die Datenbank enthält 00000und Sie suchen nach 1234 Sie werden diese Zeile ziehen, was das OP nicht beabsichtigt (wenn ich den "EXAKTEN" Teil richtig verstehe).

Was Sie wollen, ist ein regulärer Ausdruck, der so etwas wie: eine beliebige Anzahl von Nullen gefolgt von der Übereinstimmung und Ende der Zeile.

Aus dieser Frage, die wir wissen, wie führende Nullen zu trimmen: Better techniques for trimming leading zeros in SQL Server?

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

So kombinieren, dass mit Ihrer Anfrage, und Sie können wie folgt etwas tun:

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

Natürlich , die bessere (beste?) Lösung wäre, sie als INTEGERS zu speichern, so dass Sie volle Indexierbarkeit erhalten und nicht mit all dem Mist Mist haben müssen.Wenn man wirklich die genaue Zeichenfolge speichern müssen, dann haben Sie ein paar Optionen:

  • speichern die normalisierte integer in einer anderen Spalte führt und zu verwenden, die für alle internen Anfragen
  • immer eine ganze Zahl speichern, aber dann Pad mit Nullen auf Abfrage (meine Stimme)
Verwandte Themen