Wie erstelle ich eine SQL-Abfrage (MS SQL Server), bei der bei der "where" -Klausel die Groß- und Kleinschreibung nicht berücksichtigt wird?
SELECT * FROM myTable WHERE myField = 'sOmeVal'
Ich möchte, dass die Ergebnisse zurückkommen und den Fall ignorieren
sql
sql-server
where-clause
case-insensitive
Raul Agrait
quelle
quelle
WHERE
Anweisung hinzugefügt werden und wirkt sich auf alleWHERE
Klauseln aus, richtig?UPPER
oderLOWER
Kleinschreibung konvertieren oder dann dieLIKE
Suchfunktion verwenden?Bei Zeichenfolgenvergleichen wird normalerweise die Groß- und Kleinschreibung nicht berücksichtigt. Wenn Ihre Datenbank für die Sortierung konfiguriert ist, bei der zwischen Groß- und Kleinschreibung unterschieden wird, müssen Sie die Verwendung einer Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung erzwingen:
quelle
Ich habe anderswo eine andere Lösung gefunden; das heißt, zu verwenden
Aber alle hier sagen, dass es in SQL Server keine Rolle spielt, weil der Fall sowieso ignoriert wird. Ich bin mir ziemlich sicher, dass in unserer Datenbank zwischen Groß- und Kleinschreibung unterschieden wird.
quelle
Die Top-2-Antworten (von Adam Robinson und Andrejs Cainikovs ) sind insofern irgendwie richtig, als sie technisch funktionieren, aber ihre Erklärungen sind falsch und können daher in vielen Fällen irreführend sein. Während die
SQL_Latin1_General_CP1_CI_AS
Sortierung beispielsweise in vielen Fällen funktioniert, sollte nicht davon ausgegangen werden, dass es sich um die geeignete Sortierung handelt, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird. Angesichts der Tatsache, dass das OP in einer Datenbank mit einer Sortierung arbeitet, bei der zwischen Groß- und Kleinschreibung unterschieden wird (oder möglicherweise binär), wissen wir, dass das OP nicht die Kollatierung verwendet, die bei so vielen Installationen (insbesondere bei Installationen auf einem Betriebssystem) die Standardeinstellung ist mit US-Englisch als Sprache) :SQL_Latin1_General_CP1_CI_AS
. Sicher, das OP könnte verwendenSQL_Latin1_General_CP1_CS_AS
, aber bei der Arbeit mitVARCHAR
Daten ist es wichtig, die Codepage nicht zu ändern, da dies zu Datenverlust führen kann. Dies wird durch das Gebietsschema / die Kultur der Kollatierung gesteuert (z. B. Latin1_General vs French vs Hebrew usw.). Bitte beachten Sie Punkt 9 unten.Die anderen vier Antworten sind in unterschiedlichem Maße falsch.
Ich werde alle Missverständnisse hier klären, damit die Leser hoffentlich die am besten geeigneten / effizientesten Entscheidungen treffen können.
Nicht verwenden
UPPER()
. Das ist völlig unnötige zusätzliche Arbeit. Verwenden Sie eineCOLLATE
Klausel. In beiden Fällen muss ein Zeichenfolgenvergleich durchgeführt werden. Bei der VerwendungUPPER()
muss jedoch auch zeichenweise überprüft werden, ob eine Zuordnung in Großbuchstaben vorliegt, und diese dann geändert werden. Und das müssen Sie auf beiden Seiten tun. DurchCOLLATE
das Hinzufügen wird die Verarbeitung einfach angewiesen, die Sortierschlüssel nach einem anderen Regelsatz als standardmäßig zu generieren. Die VerwendungCOLLATE
ist definitiv effizienter (oder "performant", wenn Sie dieses Wort mögen :) als die VerwendungUPPER()
, wie in diesem Testskript (auf PasteBin) bewiesen .Es gibt auch das Problem , das @Ceisc in der Antwort von @ Danny festgestellt hat:
Das türkische Großbuchstaben "İ" ist das übliche Beispiel.
Nein, die Sortierung ist keine datenbankweite Einstellung, zumindest nicht in diesem Zusammenhang. Es gibt eine Standardkollatierung auf Datenbankebene, die als Standard für geänderte und neu erstellte Spalten verwendet wird, in denen die
COLLATE
Klausel nicht angegeben ist (was wahrscheinlich der Grund für dieses häufige Missverständnis ist). Sie wirkt sich jedoch nur dann direkt auf Abfragen aus, wenn Sie es sind Wenn Sie Zeichenfolgenliterale und -variablen mit anderen Zeichenfolgenliteralen und -variablen vergleichen, verweisen Sie auf Metadaten auf Datenbankebene.Nein, die Sortierung erfolgt nicht pro Abfrage.
Kollatierungen sind pro Prädikat (dh etwas Operand etwas) oder Ausdruck, nicht pro Abfrage. Dies gilt für die gesamte Abfrage, nicht nur für die
WHERE
Klausel. Dies umfasst JOINs, GROUP BY, ORDER BY, PARTITION BY usw.Nein, konvertieren Sie aus folgenden Gründen nicht zu
VARBINARY
(z. B.convert(varbinary, myField) = convert(varbinary, 'sOmeVal')
):_BIN2
wenn Sie SQL Server 2008 oder höher verwenden. Andernfalls haben Sie keine andere Wahl, als eine zu verwenden, die mit endet_BIN
. Wenn die Daten vorhanden sind, spieltNVARCHAR
es keine Rolle, welches Gebietsschema Sie verwenden, da sie in diesem Fall alle gleich sind und daherLatin1_General_100_BIN2
immer funktionieren. Wenn die DatenVARCHAR
, müssen Sie das gleiche Gebietsschema verwenden , dass die Daten aktuell (zBLatin1_General
,French
,Japanese_XJIS
usw.) , da die locale die Codepage bestimmt , die verwendet wird, und Seiten Code ändern können die Daten (dh Datenverlust) ändern.CONVERT()
wird der Standardwert 30 verwendet. Die Gefahr besteht darin, dass die Zeichenfolge, wenn sie länger als 30 Byte sein kann, stillschweigend abgeschnitten wird und Sie wahrscheinlich falsche Ergebnisse von diesem Prädikat erhalten.Nein, unterscheidet
LIKE
nicht immer zwischen Groß- und Kleinschreibung. Es verwendet die Sortierung der Spalte, auf die verwiesen wird, oder die Sortierung der Datenbank, wenn eine Variable mit einem Zeichenfolgenliteral verglichen wird, oder die Sortierung, die über die optionaleCOLLATE
Klausel angegeben wird.LCASE
ist keine SQL Server-Funktion. Es scheint entweder Oracle oder MySQL zu sein. Oder möglicherweise Visual Basic?Da der Kontext der Frage darin besteht, eine Spalte mit einem Zeichenfolgenliteral zu vergleichen, haben hier weder die Sortierung der Instanz (häufig als "Server" bezeichnet) noch die Sortierung der Datenbank direkte Auswirkungen. Kollatierungen werden für jede Spalte gespeichert, und jede Spalte kann eine andere Kollatierung haben. Diese Kollatierungen müssen nicht mit der Standardkollatierung der Datenbank oder der Kollatierung der Instanz identisch sein. Sicher, die Instanzkollatierung ist die Standardeinstellung für das, was eine neu erstellte Datenbank als Standardkollatierung verwendet, wenn die
COLLATE
Klausel beim Erstellen der Datenbank nicht angegeben wurde. Ebenso wird die Standardkollatierung der Datenbank von einer geänderten oder neu erstellten Spalte verwendet, wenn dieCOLLATE
Klausel nicht angegeben wurde.Sie sollten die Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung verwenden, die ansonsten der Sortierung der Spalte entspricht. Verwenden Sie die folgende Abfrage, um die Sortierung der Spalte zu ermitteln (ändern Sie den Namen der Tabelle und den Schemanamen):
Dann ändere einfach das
_CS
Sein_CI
. AlsoLatin1_General_100_CS_AS
würde werdenLatin1_General_100_CI_AS
.Wenn die Spalte eine binäre Kollatierung verwendet (die mit
_BIN
oder endet_BIN2
), suchen Sie eine ähnliche Kollatierung mithilfe der folgenden Abfrage:Angenommen, die Spalte verwendet
Japanese_XJIS_100_BIN2
: Gehen Sie folgendermaßen vor:Weitere Informationen zu Kollatierungen, Codierungen usw. finden Sie unter: Kollatierungsinformationen
quelle
Nein, nur die Verwendung
LIKE
funktioniert nicht.LIKE
Sucht nach Werten, die genau Ihrem angegebenen Muster entsprechen. In diesem FallLIKE
würde nur der Text 'sOmeVal' und nicht 'someval' gefunden.Eine praktikable Lösung ist die Verwendung der
LCASE()
Funktion.LCASE('sOmeVal')
Ruft die Kleinbuchstaben Ihres Textes ab: 'someval'. Wenn Sie diese Funktion für beide Seiten Ihres Vergleichs verwenden, funktioniert sie:SELECT * FROM myTable WHERE LCASE(myField) LIKE LCASE('sOmeVal')
Die Anweisung vergleicht zwei Kleinbuchstaben, sodass Ihr 'sOmeVal' mit jeder anderen Notation von 'someval' übereinstimmt (z. B. 'Someval', 'sOMEVAl' usw.).
quelle
LCASE()
in SQL Server war (zumindest nicht, dass ich sehen kann). Ich denke, diese Antwort ist für ein ganz anderes RDBMS. Weitere Informationen zu Zeichenfolgenvergleichen finden Sie in meiner Antwort .Sie können die Groß- und Kleinschreibung erzwingen und auf eine solche Varbinary umwandeln:
quelle
In welcher Datenbank befinden Sie sich? Bei MS SQL Server handelt es sich um eine datenbankweite Einstellung, oder Sie können sie pro Abfrage mit dem Schlüsselwort COLLATE überschreiben.
quelle