it-swarm.com.de

So stellen Sie fest, ob in einer Spalte ein Bindestrich (-) vorhanden ist

In einem CASE Ausdruck versuche ich, in einer Textspalte nach einem Bindestrich (-) zu suchen:

CASE 
     WHEN SUBSTRING(al.ALT_ADDRESS,1,1) IN('1','5','7') 
      AND al.NEW_ADDRESS CONTAINS '-' 
     THEN CONCAT(al.ALT_ADDRESS,al.NEW_ADDRESS)

Der Bindestrich kann sich an einer beliebigen Stelle in der Spalte befinden. Daher muss ich nur wissen, ob er vorhanden ist, unabhängig davon, wo er sich tatsächlich in der Spalte befindet.

Ich verwende derzeit genau den gleichen Code wie @ Josh bereitgestellt (LIKE '%-%'), Aber es funktioniert nicht, da es nicht die richtigen Daten für einige bestimmte Fälle zurückgibt, in denen Ich weiß, dass es "sein sollte". Der genaue Text in ALT_ADDRESS Lautet: "2754 Churchill Circle". Der genaue Text in NEW_ADDRESS Lautet: "O-89421". Die zurückgegebenen Ergebnisse enthalten jedoch nicht den NEW_ADDRESS (O-89421).

Ich habe bestätigt, dass der Bindestrich in NEW_ADDRESS Wirklich mit dem Bindestrich übereinstimmt, den ich für die Suche verwende (ASCII 45).

4
Mike Jones

Ein alternativer Ansatz zur vorhandenen Antwort besteht darin, die Funktion CHARINDEX () zu verwenden, die die Position der angegebenen Zeichenfolge zurückgibt, falls vorhanden, andernfalls 0.

select charindex('-','kevin-')

Gibt 6 zurück, da sich der Bindestrich im Vergleich zu an der sechsten Position der Zeichenfolge befindet

select charindex('-','kevin')

gibt 0 zurück, da das '-' in der Zeichenfolge nicht vorhanden ist.


Per John Eisbrener's Vorschlag, PATINDEX ist ebenfalls eine Option und erlaubt Platzhalter - was sich unter bestimmten Umständen als vorteilhaft erweisen kann.

10
kevinnwhat

Sie haben nicht erwähnt, warum der von Ihnen angegebene Code nicht funktioniert. CONTAINS wird zur Verwendung mit der Volltextsuchfunktion von SQL Server verwendet. Wenn Sie dies nicht verwenden, müssen Sie eine LIKE -Klausel mit Platzhaltern verwenden:

CASE WHEN SUBSTRING(al.ALT_ADDRESS,1,1) IN('1','5','7') AND al.NEW_ADDRESS LIKE '%-%' 
THEN CONCAT(al.ALT_ADDRESS,al.NEW_ADDRESS)

Selbst wenn Sie die Volltextsuche verwenden, kann das Übereinstimmungsverhalten mit Bindestrichen nerwartet sein, und Microsoft empfiehlt stattdessen die Verwendung von LIKE.


Sie können überprüfen, ob das Zeichen wirklich ein Bindestrich ist. So etwas sollte funktionieren:

SELECT 
    ASCII('-') as RealHypen,
    ASCII(SUBSTRING(NEW_ADDRESS, 1, 1))
FROM YourTable
WHERE ALT_ADDRESS = '2754 Churchill Circle';

Abgesehen davon kann der obige Ausdruck LIKE die Suchfunktionen eines B-Tree-Index in SQL Server nicht nutzen, sodass die Leistung bei großen Tabellen beeinträchtigt werden kann, wenn ein großer Scanvorgang erforderlich ist. Der beste Weg, dies zu mildern (sollte es für Sie oder andere in einer ähnlichen Situation gelten), hängt stark vom Kontext ab, aber im Allgemeinen sind die Hauptalternativen:

  • Indizieren einer berechneten Spalte, die die Suchbedingung auswertet
  • Verwenden von Triggern, um das Suchergebnis im Voraus beizubehalten
  • Verwenden Sie ein externes Tool, das besser zum Durchsuchen von Text geeignet ist (Elasticsearch ist beliebt).
  • Verwenden Sie n-Gramm (normalerweise für Teilzeichenfolgen mit 3 oder mehr Zeichen)
  • Verwenden Sie die Volltextsuche (dies hilft nicht bei Platzhaltern an sich oder in diesem speziellen Fall, kann jedoch für die wortbasierte Suche verwendet werden).

Wenn Sie den Leistungsaspekt untersuchen möchten, stellen Sie bitte eine Folgefrage.

14
Josh Darnell

LIKE '%-%'

Ich verwende derzeit genau den gleichen Code, den @Josh bereitgestellt hat (LIKE '%-%'), aber es funktioniert nicht, weil es nicht die richtigen Daten für einige bestimmte Fälle zurückgibt, in denen ich weiß, dass es "sein sollte". Der genaue Text in ALT_ADDRESS ist: "2754 Churchill Circle". Der genaue Text in NEW_ADDRESS ist: "O-89421". Die zurückgegebenen Ergebnisse enthalten jedoch nicht die NEW_ADDRESS (O-89421).

Ich verstehe dieses Problem überhaupt nicht,

SELECT new_address
FROM ( VALUES
  ('O-89421')
) AS t(new_address)
WHERE new_address LIKE '%-%';

Scheint für mich zu arbeiten

1
Evan Carroll