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

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

Ето три опции за връщане на редове, които съдържат главни букви в MySQL.

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

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

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 CAST(LOWER(c1) AS BINARY) <> CAST(c1 AS BINARY);

Резултат:

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

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

По подразбиране MySQL извършва търсене без значение на малки и големи букви и затова използвам CAST() функция за прехвърляне на стойностите към двоичен файл, за да получите търсене, чувствително към малки и големи букви.

Възможно е също да използвате BINARY оператор за прехвърляне на стойността към двоичен, но този оператор е остарял от MySQL 8.0.27 и може да бъде премахнат в бъдеща версия.

Във всеки случай, така изглежда кодът при използване на BINARY оператор:

SELECT c1 FROM t1
WHERE BINARY LOWER(c1) <> BINARY c1;

Може да се направи и така:

SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);

Ето резултатите, които получавам и от двете, когато изпълнявам кода в MySQL 8.0.27:

+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
| É              |
| É 123          |
| Ø              |
+----------------+
8 rows in set, 2 warnings (0.00 sec)

И когато покажа предупрежденията:

SHOW WARNINGS;

Резултат:

+---------+------+----------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                      |
+---------+------+----------------------------------------------------------------------------------------------+
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
+---------+------+----------------------------------------------------------------------------------------------+

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

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

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' AS BINARY);

Резултат:

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

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

Следователно, ако използвате тази опция, ще трябва да се уверите, че имате всички валидни знаци.

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

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

SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[A-Z]' AS BINARY);

Резултат:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL срещу PDO

  2. Комбиниране на операции UNION и LIMIT в MySQL заявка

  3. Възстановяване на достъп до изгубена парола за MySQL за PHPMyAdmin на WAMP

  4. Използване на JDeveloper с MySQL база данни и Oracle Database на AWS RDS, част 1

  5. Как да накарам MySQL да обработва UTF-8 правилно