sql >> Databáze >  >> RDS >> Sqlserver

5 způsobů, jak najít řádky, které obsahují velká písmena na serveru SQL

Níže je pět možností pro vracení řádků, které obsahují velká písmena v SQL Server.

Ukázková data

Předpokládejme, že máme tabulku s následujícími údaji:

SELECT c1 FROM t1;

Výsledek:

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

K vrácení řádků, které obsahují velká písmena, můžeme použít následující metody.

Možnost 1:Porovnejte s LOWER() Řetězec

Můžeme použít LOWER() funkce pro porovnání původní hodnoty s jejím malým ekvivalentem:

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

Výsledek:

+----------------+
| c1             |
|----------------|
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
| É              |
| É 123          |
| Ø              |
+----------------+

Pomocí nerovná se (<> ) operátor (můžete také použít != místo <> pokud chcete), vracíme pouze ty řádky, které se liší od jejich malých ekvivalentů. Důvodem, proč to děláme, je to, že pokud je hodnota stejná jako její ekvivalent malým písmenem, pak již byla na začátku malá (a nechceme ji vracet).

Používáme také COLLATE Latin1_General_CS_AS explicitně specifikovat řazení rozlišující malá a velká písmena (a zvýraznění). Bez toho byste mohli získat neočekávané výsledky v závislosti na řazení používaném ve vašem systému.

Možnost 2:Porovnání se skutečnými postavami

Další možností je použít LIKE operátor a zadejte skutečná velká písmena, která chceme porovnat:

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

Výsledek:

+----------------+
| c1             |
|----------------|
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+

V tomto případě je vráceno méně řádků než v předchozím příkladu. Je to proto, že jsem nespecifikoval znaky jako É a Ø , které byly vráceny v předchozím příkladu. Náš výsledek obsahuje É ale tento řádek byl vrácen pouze proto, že obsahuje také další velká písmena, která dělají zápas.

Proto je tato možnost omezenější než předchozí, ale poskytuje vám větší kontrolu nad postavami, které chcete najít.

Možnost 3:Porovnejte s řadou znaků

Alternativně můžeme zadat rozsah znaků, které chceme porovnat:

SELECT * FROM t1
WHERE c1 LIKE '%[A-Z]%'
COLLATE Latin1_General_100_BIN2;

Výsledek:

+----------------+
| c1             |
|----------------|
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+

V tomto případě jsem použil binární řazení (Latin1_General_100_BIN2 ). Udělal jsem to, protože binární porovnávání třídí každý případ zvlášť (takto:AB....YZ...ab...yz ).

Jiná řazení mají tendenci prolínat velká a malá písmena (jako toto:AaBb...YyZz ), které by tedy odpovídaly jak velkým, tak malým písmenům.

Možnost 4:Najděte první instanci velkého znaku

Dalším způsobem, jak to udělat, je použít PATINDEX() funkce:

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

Výsledek:

+----------------+
| c1             |
|----------------|
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+

V tomto příkladu zadáváme přesné znaky, které chceme porovnat, a proto jsme v tomto případě nezískali řádky se znaky jako É a Ø (jiný než ten, který obsahuje i jiné znaky, které byly shodné).

Jednou z výhod této techniky je, že ji můžeme použít k ignorování prvního znaku (nebo zadaného počtu znaků), pokud si to přejeme:

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

Výsledek:

Time: 0.472s
+-------+
| c1    |
|-------|
| eCafé |
+-------+

Můžeme tedy vrátit všechny řádky, které obsahují velká písmena, ale kde první znak není velké.

Důvodem je PATINDEX() vrací počáteční pozici prvního výskytu vzoru (v našem případě je vzorem seznam velkých písmen). Pokud je počáteční pozice prvního výskytu větší než 1, pak první znak není v našem seznamu velkých písmen.

Možnost 5:Najděte první instanci na základě rozsahu

Můžeme také použít PATINDEX() s rozsahem:

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

Výsledek:

+-------+
| c1    |
|-------|
| eCafé |
+-------+

Znovu jsem použil binární řazení (jako v příkladu jiného rozsahu).


  1. Výstup výsledků dotazu SQLite jako příkaz INSERT

  2. Kontejnery Oracle pro J2EE (OC4J) v R12

  3. GROUP_CONCAT ORDER BY

  4. ScaleGrid v užším výběru pro program Cloud Awards 2017–2018