2012-05-29 4 views
26

Ich habe eine SQL-Abfrage wie folgt.SQL 'LIKE' Abfrage mit '%', wo das Suchkriterium '%' enthält

Select * from table 
where name like '%' + search_criteria + '%' 

Wenn search_criteria = 'abc', wird es Daten zurückgeben xxxabcxxxx enthält, die in Ordnung ist.

Aber wenn meine search_criteria = 'abc%', wird es immer noch Daten mit xxxabcxxx zurückgeben, was nicht der Fall sein sollte.

Wie gehe ich mit dieser Situation um?

+1

warum dann Ihr eigenes% hinzu? – Randy

+0

Welche Programmiersprache verwenden Sie? – Jeshurun

+0

Programmiersprache = C# – pratik

Antwort

22

MS-SQL; Wenn Sie möchten, dass ein % Symbol in search_criteria in einem Literalzeichen und nicht als Platzhalter behandelt wird, escape zu [%];

.... where name like '%' + replace(search_criteria, '%', '[%]') + '%' 
+1

danke, gibt Spalte mit% -Zeichen 'Select * aus Tabellenname wo Spalte wie '% [%]%'' – stom

+0

wunderbare Antwort .... Danke. – User

2
Select * from table where name like search_criteria 

, wenn der Benutzer erwarten, ihre eigenen Platzhalter hinzufügen ...

0

Entfliehen Sie das Prozentzeichen \% es Teil Ihres Vergleichswertes zu machen.

+0

Dies funktioniert nur, wenn Sie die Option 'ESCAPE' des Operators 'LIKE' verwenden. Es gibt kein Standard-Escape-Zeichen (in SQL Server sowieso). –

2

Sie müssen es zu entkommen: auf vielen Datenbanken wird dies getan, indem Sie es mit Backslash, \% vorauseilen.

So abc wird abc\%.

Ihre Programmiersprache wird eine datenbankspezifische Funktion haben, um dies für Sie zu tun. Zum Beispiel hat PHP mysql_escape_string() für die MySQL Datenbank.

7

eine Escape-Klausel verwenden:

select * 
    from (select '123abc456' AS result from dual 
     union all 
     select '123abc%456' AS result from dual 
     ) 
    WHERE result LIKE '%abc\%%' escape '\' 

Ergebnis

123abc%456 

Sie Ihre Escape-Zeichen, was Sie wollen festlegen. In diesem Fall ist der Standardwert '\'. Das Escapezeichen '\%' wird zu einem Literal, das zweite '%' wird nicht maskiert, also wieder Wildcard.

Siehe List of special characters for SQL LIKE clause

10

Die einfachste Lösung ist mit "gefällt mir" ganz zu verzichten:

Select * 
from table 
where charindex(search_criteria, name) > 0 

Ich ziehe CHARINDEX über dergleichen. Historisch gesehen hatte es eine bessere Leistung, aber ich bin mir nicht sicher, ob es jetzt einen großen Unterschied macht.

+0

Ich mag diese Antwort wirklich, da sie eindeutig nicht anfällig für SQL-Injection ist, da Sie die String-Verkettung vermieden haben. – StuartQ

+0

überprüfen Sie [sql-server-performance] (http://www.sql-server-performance.com/forum/threads/charindex-vs-like.16120/) für einen v kurzen Vergleich. Beachten Sie, dass die Verwendung von 'like 'findme%'' immer noch einen Index verwenden kann, wenn dieser existiert. –

0

kann dies eine Hilfe sein :)

DECLARE @SearchCriteria VARCHAR(25) 
SET @SearchCriteria = 'employee' 
IF CHARINDEX('%', @SearchCriteria) = 0 
BEGIN 
SET @SearchCriteria = '%' + @SearchCriteria + '%' 
END 
SELECT * 
FROM Employee 
WHERE Name LIKE @SearchCriteria 
4

ein Zeichen in SQL zu entkommen Sie ! verwenden können:


Beispiel - UNTER VERWENDUNG der Escape-Sequenz

Es ist wichtig, um zu verstehen, wie man "Escape Characters" beim Pattern Matching versteht. Diese Beispiele befassen sich speziell mit ausgehenden Zeichen in Oracle.

Nehmen wir an, Sie wollten in der SQL LIKE-Bedingung nach einem% oder einem _ Zeichen suchen. Sie können dies mit einem Escape-Zeichen tun.

Bitte beachten Sie, dass Sie ein Escape-Zeichen nur als einzelnes Zeichen (Länge 1) definieren können.

Zum Beispiel:

SELECT * 
FROM suppliers 
WHERE supplier_name LIKE '!%' escape '!'; 

Diese SQL-LIKE-Bedingung Beispiel identifiziert das! Charakter als Escape-Zeichen. Diese Anweisung gibt alle Lieferanten zurück, deren Name% lautet.

Hier ist ein weiteres komplizierteres Beispiel mit Escape-Zeichen in der SQL LIKE-Bedingung.

SELECT * 
FROM suppliers 
WHERE supplier_name LIKE 'H%!%' escape '!'; 

Dieses SQL LIKE-Bedingungsbeispiel gibt alle Lieferanten zurück, deren Name mit H beginnt und in% endet. Zum Beispiel würde es einen Wert wie "Hello%" zurückgeben.

Sie können auch das Escape-Zeichen mit dem Zeichen _ in der SQL LIKE-Bedingung verwenden.

Zum Beispiel:

SELECT * 
FROM suppliers 
WHERE supplier_name LIKE 'H%!_' escape '!'; 

Diese SQL-LIKE-Bedingung Beispiel gibt alle Lieferanten, deren Name beginnt mit H und endet in _. Zum Beispiel würde es einen Wert wie 'Hallo_' zurückgeben.


Referenz: sql/like