Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

5 Möglichkeiten zum Zurückgeben von Zeilen, die Kleinbuchstaben in SQL Server enthalten

Wenn Sie in SQL Server Zeilen finden müssen, die Kleinbuchstaben enthalten, können Sie eine der folgenden Optionen ausprobieren.

Beispieldaten

Angenommen, wir haben eine Tabelle mit den folgenden Daten:

SELECT c1 FROM t1;

Ergebnis:

+----------------+
| c1             |
|----------------|
| CAFÉ           |
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| JB 007         |
| 007            |
| NULL           |
|                |
| É              |
| É 123          |
| é              |
| é 123          |
| ø              |
| Ø              |
+----------------+

Wir können die folgenden Methoden verwenden, um die Zeilen zurückzugeben, die Kleinbuchstaben enthalten.

Option 1:Vergleiche mit UPPER() Zeichenkette

Wir können den UPPER() verwenden Funktion, um den ursprünglichen Wert mit seinem Äquivalent in Großbuchstaben zu vergleichen:

SELECT * FROM t1
WHERE UPPER(c1) COLLATE Latin1_General_CS_AS <> c1;

Ergebnis:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
| é              |
| é 123          |
| ø              |
+----------------+

Durch die Verwendung von ungleich (<> ) Operator (Sie können alternativ != verwenden statt <> Wenn Sie möchten), geben wir nur die Zeilen zurück, die sich von ihren Entsprechungen in Großbuchstaben unterscheiden. Der Grund dafür ist, dass, wenn ein Wert mit seinem Äquivalent in Großbuchstaben identisch ist, er bereits von Anfang an in Großbuchstaben war (und wir ihn nicht zurückgeben möchten).

Wir verwenden auch COLLATE Latin1_General_CS_AS um explizit eine Kollatierung anzugeben, bei der die Groß-/Kleinschreibung (und Akzente) beachtet werden. Ohne dies könnten Sie abhängig von der auf Ihrem System verwendeten Sortierung unerwartete Ergebnisse erhalten.

Option 2:Mit den tatsächlichen Zeichen vergleichen

Wir können alternativ den LIKE verwenden -Operator und geben Sie die eigentlichen Kleinbuchstaben an, die wir abgleichen möchten:

SELECT * FROM t1
WHERE c1 LIKE '%[abcdefghijklmnopqrstuvwxyz]%'
COLLATE Latin1_General_CS_AS;

Ergebnis:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

In diesem Fall werden weniger Zeilen zurückgegeben als im vorherigen Beispiel. Das liegt daran, dass ich keine Zeichen wie é angegeben habe und ø , die im vorherigen Beispiel zurückgegeben wurden. Obwohl eine Zeile é enthält , diese Zeile wurde nur zurückgegeben, weil sie auch andere übereinstimmende Kleinbuchstaben enthält.

Daher ist dieses Beispiel eingeschränkter als das vorherige, aber es gibt Ihnen mehr Kontrolle über die Zeichen, die Sie abgleichen möchten.

Option 3:Mit einer Reihe von Zeichen vergleichen

Wir können alternativ den Zeichenbereich angeben, den wir abgleichen möchten:

SELECT * FROM t1
WHERE c1 LIKE '%[a-z]%'
COLLATE Latin1_General_100_BIN2;

Ergebnis:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

In diesem Fall habe ich eine binäre Sortierung verwendet (Latin1_General_100_BIN2 ). Ich habe das gemacht, weil binäre Sortierungen jeden Fall separat sortieren (wie hier:AB....YZ...ab...yz ).

Andere Sortierungen neigen dazu, Groß- und Kleinbuchstaben zu vermischen (wie hier:AaBb...YyZz ), die daher sowohl Groß- als auch Kleinbuchstaben entsprechen würde.

Option 4:Suchen Sie das erste Vorkommen eines Kleinbuchstabens

Eine andere Möglichkeit ist die Verwendung von PATINDEX() Funktion:

SELECT * FROM t1
WHERE PATINDEX('%[abcdefghijklmnopqrstuvwxyz]%', c1
COLLATE Latin1_General_CS_AS) > 0;

Ergebnis:

+----------------+
| c1             |
|----------------|
| Café           |
| café           |
| 1café          |
| eCafé          |
| James Bond 007 |
+----------------+

In diesem Beispiel geben wir genau die Zeichen an, die wir abgleichen möchten, und daher haben wir in diesem Fall keine Zeilen mit Zeichen wie é erhalten und ø (mit Ausnahme derjenigen, die auch andere übereinstimmende Zeichen enthält).

Ein Vorteil dieser Technik ist, dass wir sie verwenden können, um das erste Zeichen (oder eine bestimmte Anzahl von Zeichen) zu ignorieren, wenn wir dies wünschen:

SELECT * FROM t1
WHERE PATINDEX('%[abcdefghijklmnopqrstuvwxyz]%', c1
COLLATE Latin1_General_CS_AS) > 1;

Ergebnis:

+----------------+
| c1             |
|----------------|
| Café           |
| 1café          |
| James Bond 007 |
+----------------+

Daher können wir alle Zeilen zurückgeben, die Kleinbuchstaben enthalten, bei denen das erste Zeichen jedoch kein Kleinbuchstabe ist.

Das liegt daran, dass PATINDEX() gibt die Startposition des ersten Auftretens des Musters zurück (in unserem Fall ist das Muster eine Liste von Kleinbuchstaben). Wenn die Anfangsposition des ersten Vorkommens größer als 1 ist, dann ist das erste Zeichen nicht in unserer Liste der Kleinbuchstaben.

Während diese Technik verwendet werden könnte, um zu ignorieren, dass das erste Zeichen ein Großbuchstabe ist, schließt es nicht aus, dass das erste Zeichen ein anderes Zeichen sein könnte, wie z. B. eine Zahl. Wir können dies in der zweiten Zeile sehen, die 1café enthält .

Option 5:Finden Sie die erste Instanz basierend auf einem Bereich

Wir können auch PATINDEX() verwenden mit einem Bereich:

SELECT * FROM t1
WHERE PATINDEX('%[a-z]%', c1
COLLATE Latin1_General_100_BIN2) > 1;

Ergebnis:

+----------------+
| c1             |
|----------------|
| Café           |
| 1café          |
| James Bond 007 |
+----------------+

Ich habe wieder eine binäre Sortierung verwendet (wie beim anderen Bereichsbeispiel).