Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

5 начина за намиране на редове, които съдържат главни букви в SQL Server

По-долу са дадени пет опции за връщане на редове, които съдържат главни букви в SQL Server.

Примерни данни

Да предположим, че имаме таблица със следните данни:

SELECT c1 FROM t1;

Резултат:

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

Можем да използваме следните методи, за да върнем редовете, които съдържат главни букви.

Опция 1:Сравнете с LOWER() Низ

Можем да използваме LOWER() функция за сравняване на оригиналната стойност с нейния еквивалент с малки букви:

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

Резултат:

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

Чрез използване на не е равно на (<> ) оператор (алтернативно можете да използвате != вместо <> ако предпочитате), ние връщаме само онези редове, които са различни от техните еквиваленти с малки букви. Причината да правим това е, че ако дадена стойност е същата като нейния еквивалент с малки букви, тогава тя вече е била с малки букви (и не искаме да я връщаме).

Ние също така използваме COLLATE Latin1_General_CS_AS за изрично уточняване на съпоставяне, чувствително към малки и големи букви (и акценти). Без това бихте могли да получите неочаквани резултати в зависимост от съпоставянето, което се използва във вашата система.

Опция 2:Сравнете с действителните знаци

Друга възможност е да използвате LIKE оператор и посочете действителните главни букви, които искаме да съпоставим:

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

Резултат:

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

В този случай се връщат по-малко редове, отколкото в предишния пример. Това е така, защото не посочих знаци като É и Ø , които бяха върнати в предишния пример. Нашият резултат съдържа É но този ред беше върнат само защото съдържа и други главни букви, които правят съвпадение.

Следователно тази опция е по-ограничена от предишната, но ви предоставя повече контрол върху знаците, които искате да съпоставите.

Опция 3:Сравнете с набор от знаци

Алтернативно можем да посочим диапазона от знаци, които искаме да съпоставим:

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

Резултат:

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

В този случай използвах двоично съпоставяне (Latin1_General_100_BIN2 ). Направих това, защото двоичните съпоставяния сортират всеки случай поотделно (като това:AB....YZ...ab...yz ).

Други съпоставяния са склонни да смесват главни и малки букви (като това:AaBb...YyZz ), което следователно ще съответства както на главни, така и на малки букви.

Вариант 4:Намерете първия екземпляр на главни букви

Друг начин да го направите е да използвате PATINDEX() функция:

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

Резултат:

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

В този пример ние указваме точните знаци, които искаме да съпоставим, и така в този случай не получихме редовете със знаци като É и Ø (освен този, който съдържа и други знаци, които са били съвпадащи).

Едно от предимствата на тази техника е, че можем да я използваме, за да игнорираме първия знак (или определен брой знаци), ако желаем:

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

Резултат:

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

Следователно можем да върнем всички редове, които съдържат главни букви, но където първият символ не е главни.

Това е така, защото PATINDEX() връща началната позиция на първото появяване на шаблона (в нашия случай шаблонът е списък с главни букви). Ако началната позиция на първото появяване е по-голяма от 1, тогава първият знак не е в нашия списък с главни букви.

Опция 5:Намерете първия екземпляр въз основа на диапазон

Можем също да използваме PATINDEX() с диапазон:

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

Резултат:

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

Отново използвах двоично съпоставяне (както с другия пример за диапазон).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо SQL Server губи една милисекунда?

  2. Разбиране на функциите GROUPING и GROUPING_ID в SQL Server

  3. SQL заявка за получаване на обобщен резултат в разделители на запетая заедно с група по колона в SQL Server

  4. java.sql.SQLException:Не е намерен подходящ драйвер за jdbc:microsoft:sqlserver

  5. Елементите ORDER BY трябва да се появят в списъка за избор, ако е посочено SELECT DISTINCT