wake-up-neo.com

Wie kann man Sqlite3 beim Vergleichen von Zeichenfolgen zwischen Groß- und Kleinschreibung unterscheiden?

Ich möchte Datensätze aus der sqlite3-Datenbank anhand der Zeichenfolge auswählen. Wenn ich jedoch '=' in der where-Klausel verwende, habe ich festgestellt, dass sqlite3 die Groß- und Kleinschreibung berücksichtigt. Kann mir jemand sagen, wie man String-Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung verwendet?

259
quantity

Sie können COLLATE NOCASE in Ihrer SELECT-Abfrage verwenden:

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

Zusätzlich können Sie in SQLite angeben, dass eine Spalte bei der Erstellung der Tabelle zwischen Groß- und Kleinschreibung unterscheiden sollte, indem Sie collate nocase in der Spaltendefinition angeben (die anderen Optionen sind binary (Standardeinstellung) und rtrim; siehe hier ). Sie können auch collate nocase angeben, wenn Sie einen Index erstellen. Zum Beispiel:

 create table Test 
 (
 Text_Value Textsortierung Nr
); 

 Einfügen in Testwerte ('A'); 
 Einfügen in Testwerte ('b') ; 
 Einfügen in Testwerte ('C'); 

 Index erstellen Test_Text_Value_Index 
 on Test (Text_Value-Kollatierungsnocase); 

Ausdrücke, die Test.Text_Value enthalten, sollten jetzt die Groß- und Kleinschreibung nicht berücksichtigen. Zum Beispiel:

 sqlite> Wählen Sie Text_Value aus Test, wobei Text_Value = 'B'; 
 Text_Value 
 ---------------- 
 b 

 sqlite > Wählen Sie Text_Value aus Testreihenfolge nach Text_Value; 
 Text_Value 
 ---------------- 
 A 
 b 
 C 

 sqlite> wähle Textwert aus Testreihenfolge nach Textwert aus; 
 Textwert 
 ---------------- 
 C 
 b 
 A 

Das Optimierungsprogramm kann den Index auch potenziell für die Suche nach Groß- und Kleinschreibung und die Übereinstimmung der Spalte verwenden. Sie können dies mit dem Befehl explain SQL überprüfen, z. B .:

 sqlite> erklären, wählen Sie Text_Value aus Test, wobei Text_Value = 'b'; 
 addr opcode p1 p2 p3 
---------------- ------ -------- ---------- ---------- ---------------------- -----------
 0 Gehe zu 0 16 
 1 Ganzzahl 0 0 
 2 OpenRead 1 3 keyinfo (1, NOCASE) 
 3 SetNumColumns 1 2 
 4 String8 0 0 b 
 5 IsNull -1 14 
 6 MakeRecord 1 0 a 
 7 MemStore 0 0 
 8 MoveGe 1 14 
 9 MemLoad 0 0 
 10 IdxGE 1 14 + 
 11 Spalte 1 0 
 12 Rückruf 1 0 
 13 Weiter 1 9 
 14 Schließen 1 0 
 15 Halt 0 0 
 16 Transaktion 0 0 
 17 VerifyCookie 0 4 
 18 Springen 0 1 
 19 Noop 0 0 
425
cheduardo
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
144
Craz

Sie können es so machen:

SELECT * FROM ... WHERE name LIKE 'someone'

(Es ist nicht die -Lösung, aber in manchen Fällen ist es sehr praktisch)

"Der LIKE - Operator führt ein Muster aus Übereinstimmendem Vergleich. Der Operand an Rechts enthält das Muster, der Linke Operand enthält die Zeichenfolge .__ pattern. Ein Prozent-Symbol ("%") im Pattern entspricht einer beliebigen Folge von null oder mehr Zeichen in der Zeichenfolge. Ein Unterstrich ("_") im Pattern Stimmt mit jedem einzelnen Zeichen in der Zeichenfolge überein. Alle anderen Zeichen stimmen übereinsich selbst oder die Groß-/Kleinschreibungäquivalent (ohne Berücksichtigung der Groß- und Kleinschreibungmatching). (Ein Fehler: Nur SQLite versteht die Groß-/Kleinschreibung von ASCII -Zeichen. Der LIKE-Operator unterscheidet zwischen Groß- und Kleinschreibung ...). sind außerhalb des Bereichs ASCII. Für ist der Ausdruck 'a' LIKE 'A' ist WAHR, aber 'æ' LIKE 'Æ' ist FALSE.). "

39

Dies ist nicht spezifisch für SQLite, aber Sie können es einfach tun

SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
35
oscarkuo

Eine weitere Option besteht darin, Ihre eigene benutzerdefinierte Kollatierung zu erstellen. Sie können diese Sortierung dann in der Spalte festlegen oder sie Ihren Auswahlklauseln hinzufügen. Es wird für Bestellungen und Vergleiche verwendet.

Dies kann verwendet werden, um 'VOILA' wie 'voilà' zu machen.

http://www.sqlite.org/capi3ref.html#sqlite3_create_collation

Die Sortierfunktion muss eine ganze Zahl zurückgeben, die negativ, null oder positiv ist, wenn der erste String kleiner als, gleich oder größer als der zweite ist.

2
Nick Ericson

Eine andere Option, die in Ihrem Fall möglicherweise sinnvoll ist oder nicht, ist die Tatsache, dass Sie tatsächlich eine separate Spalte mit den Werten Ihrer vorhandenen Spalte vor dem unteren Wert haben. Dies kann mit der SQLite-Funktion LOWER() gefüllt werden, und Sie können stattdessen einen Vergleich für diese Spalte durchführen. 

Offensichtlich fügt es Redundanz hinzu und kann zu Inkonsistenzen führen. Wenn Ihre Daten jedoch statisch sind, könnten sie eine geeignete Option sein.

1
Magnus W

Sie können COLLATE NOCASE einfach in Ihrer SELECT-Abfrage verwenden:

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
0
Pullat Junaid

sie können die Like-Abfrage verwenden, um die jeweilige Zeichenfolge mit Tabellenwerten zu vergleichen.

wählen Sie den Spaltennamen aus dem Tabellennamen aus, wobei der Spaltenname wie "jeweiliger Vergleichswert" ist.

0

Es funktioniert perfekt für mich. SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE

0
Shohel Rana

Wenn die Spalte vom Typ char ist, müssen Sie den von Ihnen abgefragten Wert mit Leerzeichen anfügen. Bitte lesen Sie diese Frage hier . Dies zusätzlich zur Verwendung von COLLATE NOCASE oder einer der anderen Lösungen (upper () usw.).

0
Has AlTaiar