SQL - Groß- / Kleinschreibung ignorieren, während nach einer Zeichenfolge gesucht wird

130


Ich habe die folgenden Daten in einer Tabelle
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

In SQL muss ich eine Abfrage schreiben, die nach einer Zeichenfolge in einer Tabelle sucht. Bei der Suche nach einer Zeichenfolge sollte die Groß- und Kleinschreibung ignoriert werden. Für die unten genannte SQL-Abfrage

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

gibt alle oben genannten Daten an, während

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

gibt nicht.

Z.B. Wenn ich nach 'PriceOrder' oder 'priceOrder' suche, funktioniert es, aber 'priceorder' oder 'Priceorder' funktionieren nicht. Ich habe mit der folgenden Abfrage versucht, COLLATE zu verwenden, aber es funktioniert nicht. Lass mich wissen, wo ich falsch liege.

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'
Stoßwelle
quelle

Antworten:

232

Verwenden Sie so etwas -

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')

oder

SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')
Aditya Kakirde
quelle
14
Ich denke, Sie sollten immer großgeschriebene Zeichenfolgen (UPPER) als Best Practice vergleichen. Google "
turkish
2
Möchten Sie wissen, ob Ihre Antwort Leistungsprobleme aufweist, indem Sie einen Spaltenwert in einen Groß- UPPERoder LOWERKleinschreibung konvertieren oder dann die LIKESuchfunktion verwenden?
Shaijut
Eigentlich müssten Sie sowohl die UPPER- als auch die LOWER-Variante vergleichen, da einige Zeichen unterschiedliche Darstellungen in Großbuchstaben, aber dieselbe Darstellung in Kleinbuchstaben haben. Für andere Zeichen kann das Gegenteil der Fall sein. Java erwähnt das georgische Alphabet speziell als Grund für die Durchführung eines zusätzlichen toLowerCase () in seinem Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung.
Crusha K. Rool
1
Leider führt dieser Ansatz zu einem vollständigen Tabellenscan, wie in diesem Beitrag beschrieben: alvinalexander.com/sql/… . Eine Indexsuche kann nicht angewendet werden, da die gefilterte Spalte durch die Funktion UPPER / LOWER geändert wird.
Jeff S.
Das Festlegen einer Sortierung (vor dem Erstellen des Index) scheint der bessere Ansatz zu sein, wenn die Abfrageleistung mit Upper / Lower nicht ausreicht.
Jeff S.
10

Siehe diese ähnliche Frage und Antwort zur Suche mit Groß- und Kleinschreibung - SQL Server ignoriert Groß- und Kleinschreibung in einem where-Ausdruck

Versuchen Sie etwas wie:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'
Miguel-F
quelle
Es funktioniert nicht. Ich bekomme eine SQL-Abfrage, die vor dem Sortieren nicht richtig beendet wurde.
Schockwelle
@ Miguel-F .. es funktioniert gut, aber wie unterscheidet es sich von SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '% priceorder%', weil dies auch gut für mich funktioniert ..
Jishant
Ich würde empfehlen, stattdessen 'SQL_Latin1_General_Cp1_CI_AS_KI_WI' zu verwenden. Es ist nicht sensibel für eine Suche.
user8155123
8

So was.

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

In postgresql.

Hangk
quelle
4
Diese Frage ist mit sql-server gekennzeichnet, sodass eine postgres-Antwort nicht relevant ist.
Liam
4

Sie sollten wahrscheinlich SQL_Latin1_General_Cp1_CI_AS_KI_WIals Ihre Zusammenstellung verwenden. Bei dem in Ihrer Frage angegebenen Wert wird ausdrücklich zwischen Groß- und Kleinschreibung unterschieden.

Eine Liste der Kollatierungen finden Sie hier .


quelle