Ето четири опции за връщане на редове, които съдържат малки букви в MariaDB.
Примерни данни
Да предположим, че имаме таблица със следните данни:
SELECT c1 FROM t1;
Резултат:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | café | | 1café | | eCafé | | James Bond 007 | | JB 007 | | 007 | | NULL | | | | É | | É 123 | | é | | é 123 | | ø | | Ø | +----------------+
Можем да използваме следните методи, за да върнем редовете, които съдържат малки букви.
Опция 1:Сравнете с POSIX клас символи
Можем да използваме REGEXP
оператор за извършване на съвпадение на модел на регулярен израз.
Една проста опция е да сравните нашата колона с [:lower:]
POSIX клас символи:
SELECT c1 FROM t1
WHERE c1 REGEXP '[[:lower:]]';
Резултат:
+----------------+ | c1 | +----------------+ | Café | | café | | 1café | | eCafé | | James Bond 007 | | é | | é 123 | | ø | +----------------+
RLIKE
е синоним на REGEXP
, така че можем да заменим REGEXP
с RLIKE
за да получите същия резултат:
SELECT c1 FROM t1
WHERE c1 RLIKE '[[:lower:]]';
Опция 2:Сравнете с UPPER()
Низ
Друга възможност е да използвате UPPER()
функция за сравняване на оригиналната стойност с нейния еквивалент с главни букви:
SELECT c1 FROM t1
WHERE BINARY UPPER(c1) <> BINARY c1;
Резултат:
+----------------+ | c1 | +----------------+ | Café | | café | | 1café | | eCafé | | James Bond 007 | | é | | é 123 | | ø | +----------------+
Чрез използване на не е равно на (<>
) оператор (алтернативно можете да използвате !=
вместо <>
ако предпочитате), ние връщаме само онези редове, които са различни от техните еквиваленти с главни букви. Причината да правим това е, че ако стойността е същата като нейния еквивалент с главни букви, тогава тя вече е била с главни букви (и не искаме да я връщаме).
По подразбиране MariaDB извършва търсене без значение на малки и големи букви и затова използвам BINARY
оператор, за да получите търсене, чувствително към главни букви.
Това може да стане и по следния начин:
SELECT c1 FROM t1
WHERE BINARY(UPPER(c1)) <> BINARY(c1);
Вариант 3:Сравнете с действителните знаци
Друга възможност е да използвате REGEXP
оператор с модел на регулярен израз, който изрично включва всеки символ с малка буква, който искаме да съпоставим:
SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[abcdefghijklmnopqrstuvwxyz]';
Резултат:
+----------------+ | c1 | +----------------+ | Café | | café | | 1café | | eCafé | | James Bond 007 | +----------------+
Този път се връщат по-малко редове, отколкото в предишните примери. Това е, защото не съм посочил знаци като é
и ø
, които бяха върнати в тези примери. Нашият резултат съдържа é
но този ред беше върнат само защото съдържа и други малки букви, които правят съвпадение.
Следователно, ако използвате тази опция, ще трябва да се уверите, че имате всички валидни знаци.
Опция 4:Сравнете с набор от знаци
Друг начин да го направите е да посочите диапазона от знаци, които искаме да съпоставим:
SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[a-z]';
Резултат:
+----------------+ | c1 | +----------------+ | Café | | café | | 1café | | eCafé | | James Bond 007 | +----------------+