SQL Case Sensitive String Compare

233

Wie vergleichen Sie Zeichenfolgen, sodass der Vergleich nur dann wahr ist, wenn auch die Fälle der einzelnen Zeichenfolgen gleich sind? Beispielsweise:

Select * from a_table where attribute = 'k'

... gibt eine Zeile mit dem Attribut 'K' zurück. Ich möchte dieses Verhalten nicht.

Amccormack
quelle
Es ist möglicherweise nicht das, was Sie benötigen, aber Sie können die Sortierung ändern oder eine bestimmte Sortierung in Ihrer Abfrage verwenden.
Kane
7
Welches SQL-Produkt?
Tag, wenn

Antworten:

387
Select * from a_table where attribute = 'k' COLLATE Latin1_General_CS_AS 

Hat den Trick gemacht.

Amccormack
quelle
4
Normalerweise würde ich Latin1_General_Bin
gbn
3
Ja, der Standardansatz besteht darin, eine Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung zu verwenden, obwohl die Kollatierungen selbst herstellerspezifisch sind. Ist Ihre SQL Server-Syntax?
Tag, wenn
In meinem Fall habe ich 1 Spalte in meiner Datenbank, bei der zwischen Groß- und Kleinschreibung unterschieden wird. Ich musste es mit einer Standardspalte (CI) vergleichen. Ich habe eine Variation dieses WHERE Foo.Bar = (Baz.Bar COLLATE Latin1_General_CS_AS)
Hypnovirus
2
Danke, aber was ist Latin1_General_CS_AS? Ist es ein spezielles Schlüsselwort?
Vijay Singh Rana
2
@VijaySinghRana Latin1_General_CS_ASist eine Spezifikation der Sortierung. Die Sortierung bezieht sich auf eine Reihe von Regeln, die bestimmen, wie Daten sortiert und verglichen werden. Weitere Informationen finden Sie auf dieser Seite .
Amccormack
51

Mit dieser Syntax können Sie dieses Attribut auch in Groß- und Kleinschreibung konvertieren :

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CS_AS

Jetzt wird bei Ihrer Suche zwischen Groß- und Kleinschreibung unterschieden .

Wenn Sie die Groß- und Kleinschreibung dieser Spalte wieder unempfindlich machen möchten , verwenden Sie

ALTER TABLE Table1
ALTER COLUMN Column1 VARCHAR(200)
COLLATE SQL_Latin1_General_CP1_CI_AS
Jugal
quelle
29

Sie können Spalten einfach in VARBINARY (Max Length) konvertieren. Die Länge muss das Maximum sein, das Sie erwarten, um einen fehlerhaften Vergleich zu vermeiden. Es reicht aus, die Länge als Spaltenlänge festzulegen. Die Spalte "Trimmen" hilft Ihnen beim Vergleichen des tatsächlichen Werts, außer dass der Leerzeichen eine Bedeutung und einen Wert in Ihren Tabellenspalten hat. Dies ist ein einfaches Beispiel. Wie Sie sehen können, schneide ich den Spaltenwert und konvertiere und vergleiche:

CONVERT(VARBINARY(250),LTRIM(RTRIM(Column1))) = CONVERT(VARBINARY(250),LTRIM(RTRIM(Column2)))

Ich hoffe das hilft.

QMaster
quelle
2
genau das, wonach ich gesucht habe. Eine einfache Möglichkeit, einen einmaligen Vergleich zwischen Groß- und Kleinschreibung durchzuführen, um Einträge zu finden, die Großbuchstaben enthalten.
Mike D.
20

Genau wie eine andere Alternative könnten Sie HASHBYTES verwenden, ungefähr so:

SELECT * 
FROM a_table 
WHERE HASHBYTES('sha1', attribute) = HASHBYTES('sha1', 'k')
Dave Sexton
quelle
1
Was ist mit Kollisionen? Es wäre selten, aber ich gehe davon aus, dass es mehrere Zeichenfolgen gibt, die denselben Wert haben.
David Klempfner
Ja möglich, aber extrem selten bei einem so einfachen String-Beispiel hätte ich gedacht.
Dave Sexton
@DavidKlempfner warum nicht zuerst vergleichen und wenn sie übereinstimmen, dann auch nach Hashbytes suchen? Wir könnten dies zu einer Funktion machen und sie wie StringsAreCaseSensitiveEqual (a, b) => a = b UND HASHBYTES ('sha1', a) = HASHBYTES ('sha1', b)
aufrufen
3

Sie können festlegen , attributewie BINARYoder verwenden INSTRoder STRCMPIhre Suche durchzuführen.

MatTheCat
quelle
In dieser Antwort geht es anscheinend nicht um SQL Server gemäß dem Frage-Tag. Dem DBMS fehlen diese INSTRund STRCMPFunktionen.
Jonas