V MariaDB, LIKE
operátor umožňuje provádět porovnávání vzorů. Určuje, zda určitý řetězec znaků odpovídá zadanému vzoru. Vrací buď 1
(TRUE) nebo 0
(NEPRAVDIVÉ).
Vzor může obsahovat běžné znaky a také %
a _
zástupné znaky.
Tyto zástupné znaky jsou vysvětleny v následující tabulce.
Zástupný znak | Popis |
---|---|
% | Odpovídá libovolnému řetězci nula nebo více znaků. Může být použit buď jako předpona, nebo jako přípona, a také může být použit uprostřed řetězce. |
_ | Odpovídá libovolnému jednotlivému znaku. |
Syntaxe
Syntaxe vypadá takto:
expr LIKE pat [ESCAPE 'escape_char']
Příklad
Předpokládejme, že máme následující tabulku:
SELECT * FROM Pets;
Výsledek:
+-------+-----------+---------+---------+------------+ | 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 | +-------+-----------+---------+---------+------------+
Zde je příklad, který ukazuje, jak LIKE
operátor pracuje.
SELECT *
FROM Pets
WHERE PetName LIKE 'F%';
Výsledek:
+-------+-----------+---------+---------+------------+ | 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 | +-------+-----------+---------+---------+------------+
V tomto příkladu jsem použil LIKE
operátor ve spojení s %
zástupný operátor pro návrat domácích mazlíčků, jejichž jméno začíná písmenem F
.
Rozlišovat malá a velká písmena
LIKE
provádí shody podřetězců bez rozlišení malých a velkých písmen, pokud řazení výrazu a vzoru nerozlišuje malá a velká písmena.
Proto můžeme změnit předchozí příklad tak, aby používal malé f
a stále získáte stejný výsledek:
SELECT *
FROM Pets
WHERE PetName LIKE 'f%';
Výsledek:
+-------+-----------+---------+---------+------------+ | 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 | +-------+-----------+---------+---------+------------+
Můžeme však vynutit shodu rozlišující malá a velká písmena pomocí COLLATE
klauzule s binárním řazením. Případně můžete použít CAST()
vynutit jej na binární řetězec.
Příklad:
SELECT *
FROM Pets
WHERE PetName LIKE 'f%' COLLATE utf8_bin;
Výsledek:
Empty set (0.000 sec)
Nejsou vráceny žádné výsledky.
Ale když to změníme na velké F
:
SELECT *
FROM Pets
WHERE PetName LIKE 'F%' COLLATE utf8_bin;
Výsledek:
+-------+-----------+---------+---------+------------+ | 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 | +-------+-----------+---------+---------+------------+
Máme tři zápasy, jak se očekávalo.
Číselné argumenty
Číselné argumenty jsou vynuceny na binární řetězce.
SELECT *
FROM Pets
WHERE PetId LIKE 7;
Výsledek:
+-------+-----------+---------+---------+------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------+ | 7 | 3 | 2 | Bark | NULL | +-------+-----------+---------+---------+------+
Data
Zde je příklad, který odpovídá roku od data:
SELECT *
FROM Pets
WHERE DOB LIKE '2020%';
Výsledek:
+-------+-----------+---------+---------+------------+ | 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 | +-------+-----------+---------+---------+------------+
Můžete také použít LIKE
operátor proti výsledku funkcí data, jako je DAYNAME()
, MONTHNAME()
, atd.
SELECT *
FROM Pets
WHERE MONTHNAME(DOB) LIKE 'Nov%';
Výsledek:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +-------+-----------+---------+---------+------------+
_
Operátor zástupných znaků
Podtržítko (_
) zástupný operátor odpovídá libovolnému jednotlivému znaku.
Příklad:
SELECT *
FROM Pets
WHERE PetName LIKE '_e%';
Výsledek:
+-------+-----------+---------+---------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | +-------+-----------+---------+---------+------------+ | 2 | 3 | 3 | Fetch | 2019-08-16 | | 8 | 2 | 4 | Meow | NULL | +-------+-----------+---------+---------+------------+
V tomto případě jsme porovnali jména zvířat, kde druhý znak je e
.
Únikový znak
Někdy se můžete dostat do situace, kdy potřebujete hledat podtržítko nebo znak procenta. V takových případech můžete použít zpětné lomítko (\
), abyste těmto znakům unikli. To zabrání tomu, aby byly interpretovány jako zástupné znaky.
Předpokládejme, že máme následující tabulku:
SELECT * FROM Owners;
Výsledek:
+---------+-----------+----------+----------------+--------------------+ | 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] | +---------+-----------+----------+----------------+--------------------+
Všimněte si, že vlastník 2 (Bart) má e-mailovou adresu, která obsahuje podtržítko.
Zde je příklad toho, co se stane, když neděláme uniknout podtržítku:
SELECT * FROM Owners
WHERE Email LIKE 'b_%';
Výsledek:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +---------+-----------+----------+----------------+--------------------+
V tomto případě to odpovídalo dvěma řadám. V tomto případě nezáleželo na tom, jaký byl druhý znak – odpovídala jakémukoli charakter. To, že první řádek obsahuje podtržítko u druhého znaku, je jen náhoda. Odpovídalo by to, i kdyby to bylo něco jiného.
Ale co kdybychom chtěli porovnat pouze ty e-mailové adresy, které mají skutečný podtržítko jako druhý znak?
Zde přichází na řadu úniková postava.
SELECT * FROM Owners
WHERE Email LIKE 'b\_%';
Výsledek:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | +---------+-----------+----------+----------------+--------------------+
Nyní získáme pouze jeden řádek – řádek, který obsahuje podtržítko jako druhý znak.
Změna únikového znaku
Je možné změnit únikový znak. Můžete to udělat pomocí ESCAPE
argument.
Příklad:
SELECT * FROM Owners
WHERE Email LIKE 'b*_%' ESCAPE '*';
Výsledek:
+---------+-----------+----------+----------------+--------------------+ | OwnerId | FirstName | LastName | Phone | Email | +---------+-----------+----------+----------------+--------------------+ | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | +---------+-----------+----------+----------------+--------------------+
V tomto případě jsem přiřadil hvězdičku (*
) jako znak escape.
To se může hodit zejména tehdy, když potřebujete použít zpětné lomítko pro jiné účely, jako je kódování speciálních znaků. V takových případech se může stát, že budete muset těmto postavám „dvojitě uniknout“, což by mohlo být matoucí. Změna únikového znaku proto může v takových situacích pomoci.
Hodnoty NULL
Procento (%
) zástupný znak odpovídá čemukoli – téměř. Jedna věc, která se neshoduje, je NULL
.
SELECT * FROM Owners
WHERE Email LIKE '%';
Výsledek:
+---------+-----------+----------+----------------+--------------------+ | 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] | +---------+-----------+----------+----------------+--------------------+
V naší tabulce jsou dva řádky s NULL
v Email
sloupec, ale ty zde nejsou vráceny.
Výkon
Dotazy, které obsahují LIKE
operátor může běžet mnohem pomaleji než jiné dotazy a pravděpodobně byste se měli vyhnout použití LIKE
operátora, pokud jej opravdu nepotřebujete. Pomocí %
operátor jako prefix může být obzvláště pomalý.
To neznamená, že byste to neměli používat vůbec. LIKE
operátor je nedílnou součástí SQL a setkáte se s mnoha scénáři, kdy to bude jediná možnost (nebo alespoň ta nejlepší).
Položka NOT LIKE
Operátor
Můžete také použít NOT LIKE
otestovat, zda řetězec nedělá odpovídat vzoru.