В MariaDB, LIKE
оператор ви позволява да правите съвпадение на шаблони. Той определя дали конкретен символен низ съответства на определен модел. Връща или 1
(ВЯРНО) или 0
(НЕВЕРНО).
Моделът може да включва обикновени знаци, както и %
и _
заместващи знаци.
Тези заместващи знаци са обяснени в следващата таблица.
Заместващ знак | Описание |
---|---|
% | Съвпада с всеки низ от нула или повече знака. Може да се използва като префикс или суфикс и може да се използва и в средата на низ. |
_ | Съвпада на всеки единичен знак. |
Синтаксис
Синтаксисът е така:
expr LIKE pat [ESCAPE 'escape_char']
Пример
Да предположим, че имаме следната таблица:
SELECT * FROM Pets;
Резултат:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +-------+-----------+---------+---------+------------+
Ето пример, за да демонстрирате как LIKE
оператор работи.
SELECT *
FROM Pets
WHERE PetName LIKE 'F%';
Резултат:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +-------+-----------+---------+---------+------------+
В този пример използвах LIKE
оператор във връзка с %
оператор за заместващ знак, за да върне домашни любимци, чието име започва с буквата F
.
Чувствителност на регистрите
LIKE
изпълнява съвпадения на поднизове, независимо от главните букви, ако съпоставянето за израза и шаблона не е чувствително.
Следователно можем да променим предишния пример, за да използваме малки букви f
, и пак получавате същия резултат:
SELECT *
FROM Pets
WHERE PetName LIKE 'f%';
Резултат:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +-------+-----------+---------+---------+------------+
Въпреки това, ние можем да принудим съвпадение, чувствително към главни букви, като използваме COLLATE
клауза с двоично съпоставяне. Като алтернатива можете да използвате CAST()
за да го принудите към двоичен низ.
Пример:
SELECT *
FROM Pets
WHERE PetName LIKE 'f%' COLLATE utf8_bin;
Резултат:
Empty set (0.000 sec)
Не се връщат резултати.
Но ако го променим на главни букви F
:
SELECT *
FROM Pets
WHERE PetName LIKE 'F%' COLLATE utf8_bin;
Резултат:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +-------+-----------+---------+---------+------------+
Получаваме три мача, както се очакваше.
Числови аргументи
Числовите аргументи са принудени към двоични низове.
SELECT *
FROM Pets
WHERE PetId LIKE 7;
Резултат:
+-------+-----------+---------+---------+------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------+ | 7 | 3 | 2 | Bark | NULL | +-------+-----------+---------+---------+------+
Дати
Ето пример, който съответства на годината от дата:
SELECT *
FROM Pets
WHERE DOB LIKE '2020%';
Резултат:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +-------+-----------+---------+---------+------------+
Можете също да използвате LIKE
оператор срещу резултата от функции за дата, като DAYNAME()
, MONTHNAME()
и др.
SELECT *
FROM Pets
WHERE MONTHNAME(DOB) LIKE 'Nov%';
Резултат:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +-------+-----------+---------+---------+------------+
_
Оператор за заместващи знаци
Долната черта (_
) операторът за заместващ знак съответства на всеки единичен знак.
Пример:
SELECT *
FROM Pets
WHERE PetName LIKE '_e%';
Резултат:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 2 | 3 | 3 | Fetch | 2019-08-16 | | 8 | 2 | 4 | Meow | NULL | +-------+-----------+---------+---------+------------+
В този случай съпоставихме имена на домашни любимци, където вторият знак е e
.
Характерът за бягство
Понякога може да се окажете в ситуацията, в която трябва да търсите долна черта или знак за процент. В такива случаи можете да използвате обратна наклонена черта (\
), за да избягате от тези знаци. Това ще предотврати тяхното интерпретиране като заместващи знаци.
Да предположим, че имаме следната таблица:
SELECT * FROM Owners;
Резултат:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +---------+-----------+----------+----------------+--------------------+
Забележете, че собственик 2 (Барт) има имейл адрес, който съдържа долна черта.
Ето пример за това какво се случва, когато не избягване на долна черта:
SELECT * FROM Owners
WHERE Email LIKE 'b_%';
Резултат:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +---------+-----------+----------+----------------+--------------------+
В този случай тя съвпада с два реда. В този случай нямаше значение какъв е вторият знак – отговаряше на който и да е характер. Фактът, че първият ред съдържа долна черта за втория знак, е просто съвпадение. Щеше да съвпадне дори и да беше нещо друго.
Но какво, ако искаме да съпоставим само тези имейл адреси, които имат действително долно черта като втори знак?
Тук идва символът за бягство.
SELECT * FROM Owners
WHERE Email LIKE 'b\_%';
Резултат:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | +---------+-----------+----------+----------------+--------------------+
Сега получаваме само един ред – редът, който съдържа долната черта като втори знак.
Промяна на изходния символ
Възможно е да промените escape символа. Можете да направите това с ESCAPE
аргумент.
Пример:
SELECT * FROM Owners
WHERE Email LIKE 'b*_%' ESCAPE '*';
Резултат:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | +---------+-----------+----------+----------------+--------------------+
В този случай аз присвоих звездичката (*
) като escape-символ.
Това може да бъде особено удобно, когато трябва да използвате обратната наклонена черта за други цели, като например кодиране на специални символи. В такива случаи може да се наложи да „избягате двойно“ от тези знаци, което може да стане объркващо. Следователно промяната на escape-символа може да помогне в такива ситуации.
NULL стойности
Процентът (%
) заместващият знак съответства на всичко – почти. Едно нещо, което не съвпада, е NULL
.
SELECT * FROM Owners
WHERE Email LIKE '%';
Резултат:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +---------+-----------+----------+----------------+--------------------+
В нашата таблица има два реда с NULL
в Email
колона, но те не се връщат тук.
Ефективност
Заявки, които съдържат LIKE
операторът може да работи много по-бавно от другите заявки и вероятно трябва да избягвате използването на LIKE
оператор, освен ако наистина не се нуждаете от него. Използване на %
операторът като префикс може да бъде особено бавен.
Това не означава, че изобщо не трябва да го използвате. LIKE
операторът е неразделна част от SQL и ще срещнете много сценарии, при които той ще бъде единствената опция (или поне най-добрата опция).
NOT LIKE
Оператор
Можете също да използвате NOT LIKE
за да проверите дали низ не съвпада с модел.