2015-05-02 6 views
9

Ich habe eine Tabelle MannschaftSQL-Select-ähnlichen Text

Id Name ... 
1 Chelsea 
2 Arsenal 
3 Liverpool 

Jetzt muss ich suchen, wenn mein Team Tabelle einen Namen wie "FC Chelsea" hat. Wie kann ich in diesem Fall eine Select-Abfrage erstellen, wenn die Suchzeichenfolge zusätzliche Wörter enthalten kann?

Ich könnte Lucene.net versuchen, aber es ist eine Art Overkill nur für eine kleine Verwendung und es würde Zeit brauchen, um es zu lernen.

Antwort

9

Sie müssten die Zeichenfolge aufteilen und nach jedem Wort in der Zeichenfolge suchen. SQL Server hat dafür keine native Funktion, aber es gibt verschiedene Beispiele im Web.

Diese Funktion nimmt eine Zeichenfolge und ein Trennzeichen und teilt die Zeichenfolge durch das Trennzeichen auf und gibt eine Tabelle der resultierenden Werte zurück.

CREATE FUNCTION dbo.SplitVarchar (@stringToSplit varchar(4000), @delimiter CHAR(1)) 
RETURNS @Result TABLE(Value VARCHAR(50))AS 
BEGIN 
    --This CTE will return a table of (INT, INT) that signify the startIndex and stopIndex 
    --of each string between delimiters. 
    WITH SplitCTE(startIndex, stopIndex) AS 
    (
     SELECT 1, CHARINDEX(@delimiter, @stringToSplit) --The bounds of the first word 
     UNION ALL 
     SELECT stopIndex + 1, CHARINDEX(@delimiter, @stringToSplit, stopIndex+1) 
     FROM SplitCTE    --Recursively call SplitCTE, getting each successive value 
     WHERE stopIndex > 0 
    ) 

    INSERT INTO @Result 
    SELECT 
     SUBSTRING(@stringToSplit, --String with the delimited data 
      startIndex,    --startIndex of a particular word in the string 
      CASE WHEN stopIndex > 0 THEN stopIndex-startIndex --Length of the word 
      ELSE 4000 END --Just in case the delimiter was missing from the string 
      ) AS stringValue 
    FROM SplitCTE 

    RETURN 
END; 

Sobald Sie Ihre getrennte Zeichenfolge in eine Tabelle drehen, können Sie es mit der Tabelle JOIN Sie möchten Werte, die Art und Weise suchen und zu vergleichen.

DECLARE @TeamName VARCHAR(50)= 'Chelsea FC' 

SELECT DISTINCT Name 
FROM Team 
INNER JOIN (SELECT Value FROM dbo.SplitVarchar(@TeamName, ' ')) t 
    ON CHARINDEX(t.Value, Name) > 0 

Ergebnisse:

| Name | 
|---------| 
| Chelsea | 

SQL Fiddle example

basierend ich mein Design auf Amit Jethva des Convert Comma Separated String to Table : 4 different approaches

+2

Das ist beeindruckend – potashin

+1

Danke, ich hatte eine Writeup für eine ähnliche Frage gemacht, die (wegen der schlecht formuliert) geschlossen wurde, bevor ich antworten konnte. Zum Glück habe ich meine Arbeit gerettet. :) –

+0

Dies ist Overkill-Lösung. –

2

Sie like auf diese Weise verwenden können:

declare @s varchar(20) = 'Chelsey FC' 

select * from Team 
where name like '%' + @s + '%' or 
     @s like '%' + name + '%' 

Dies wird Zeilen auswählen, wenn @s enthält Name oder Name@s enthält.