Benutzer mit den meisten Antworten
SQL-Befehl mit Like

Frage
-
Hallo zusammen,
grundsätzlich werden Datenbanken mit folgendem Code selektiert:
SELECT column1, column2, ... FROM table_name WHERE column LIKE pattern;
Kann man - Like - auch direkt an ein Datenfeld binden:
SELECT column1, column2, ... FROM table_name WHERE Like column = pattern;
Danke
Dirk
Antworten
-
Hallo Dirk,
Nein, denn like und = ist nicht das gleiche.
https://msdn.microsoft.com/de-de/library/ms179859.aspx
zudem würde dein Beispiel auch nicht funktionieren da in der Where Klausel entweder
where column1 like pattern
oder
where column2 like pattern
stehen müsste.
Benjamin Hoch
MCSE: Data Platform & Data Management and Analytics
MCSA: SQL Server 2012/2014 & 2016 DB Administration
MCSA: Windows Server 2012
- Bearbeitet Benjamin.Hoch Montag, 5. Juni 2017 14:47
- Als Antwort markiert Dirk2006 Montag, 5. Juni 2017 14:59
Alle Antworten
-
Hallo Dirk,
Nein, denn like und = ist nicht das gleiche.
https://msdn.microsoft.com/de-de/library/ms179859.aspx
zudem würde dein Beispiel auch nicht funktionieren da in der Where Klausel entweder
where column1 like pattern
oder
where column2 like pattern
stehen müsste.
Benjamin Hoch
MCSE: Data Platform & Data Management and Analytics
MCSA: SQL Server 2012/2014 & 2016 DB Administration
MCSA: Windows Server 2012
- Bearbeitet Benjamin.Hoch Montag, 5. Juni 2017 14:47
- Als Antwort markiert Dirk2006 Montag, 5. Juni 2017 14:59
-
Grundsätzlich kann man in SQL immer auch eine sog. Hostvariable angeben, wenn ein "Ausdruck" möglich ist.
Je nach Dialekt und Integration wird dieser halt unterschiedlich angegeben, daher halt ich deinen Ausdruck für ggf. falsch.
Im SQL-Standard steht das "?" für die Hostvariable, wie das für deine Umgebung passt, kann ich natürlich nicht sagen, aber folgende SQL's sind möglich:where column like '%abc%' <= Abfrage Konstante
where column like ? <= Abfrage gegen ParameterNun muss als der Parameter auch ebenso das "%" beinhalten. Auchdie Klein/Großschreibung wird beachtet.
Je nach Komfort, den man seinen Usern bietet wäre auch folgendes Konstrukt denkbar:where upper(column) like '%' concat upper(trim(?)) concat '%'
In diesem Fall ist die Abfrage nicht casesensitive und die %-Zeichen dürfen ebenso fehlen.
Die Funktionen sind ggf. dem Dialekt anzupassen:concat => concat(Ausdruck1, Ausdruck2, ..., AusdruckN)
Auch das "?" ist an dieser Stelle ggf. zu casten, wenn der Dialekt den Typ nicht erkennen kann:
cast(? as varchar(255))Das "?" ist durch den Parameter zu ersetzen, z.B. @MyVar oder [MyVar], ...
-
concat => concat(Ausdruck1, Ausdruck2, ..., AusdruckN)
DAS würde ich auf jeden Fall unterlassen, da somit die Abfrage NONSARGable wird :).
http://www.db-berater.de/2017/02/sargable-und-non-sargable-abfragen/
Bei Suchmustern (Patterns) mit LIKE sollte man auch auf die Collation achten, um die Abfrage - eventuell - etwas performanter zu machen.
http://www.db-berater.de/2017/02/optimierung-von-like-suche/
Uwe Ricken (Blog | Twitter)
Microsoft Certiied Master - SQL Server 2008
Microsoft Certified Solution Master - CHARTER Data Platform
Microsoft Certified Solution Expert - Data Platform
db Berater GmbH
Microsoft SQL Server Blog (german only) -
Da der Like-Operator sowieso meist keinen Index verwenden kann, ist eine Operation auf dem Ausdruck hier deswegen nicht langsamer. Und ob ich nun die %-Zeichen per Ausdruck anfüge oder als Konstante übergebe macht da keinen Unterschied.
Die SQL-Optimierer sollten inzwischen aber so klug sein, dass sie bei Ausdrücken zwischen Hostvariablen und Tabellenspalten unterscheiden können, so dass ein "Concat('%', cast(? as varchar(n)), '%')" zur Laufzeit wie eine Konstante verarbeitet wird.
Ich weiß zwar nicht, wie der SQL-Server dies auflöst, andere Datenbanken (DB2) können dies aber durchaus.
Was dem SQL-Server allerdings fehlt, ist ggf. ein "Create Index ... computed by ...", der solche Probleme wie Concat o.ä. über Tabellenspalten lösen würde.
Allerdings scheint der SQL-Server durchaus einen Index auf computed Columns zu erlauben.
Bei der DB2 habe ich da durchaus gute Erfahrungen.Ausdrücke in einer Whereklausel sollte man daher nicht grundsätzlich ausschließen.
-
Hallo Bernd,
du hast Recht - mein Gott, wie bescheuert von mir. Natürlich ist das in der beschriebenen Konstellation vollkommen egal ob SARGable oder nicht? Ich muss mehr nachdenken, bevor ich schreibe :)
Danke für den Hinweis...
Uwe Ricken (Blog | Twitter)
Microsoft Certiied Master - SQL Server 2008
Microsoft Certified Solution Master - CHARTER Data Platform
Microsoft Certified Solution Expert - Data Platform
db Berater GmbH
Microsoft SQL Server Blog (german only)