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 | example@sqldat.com | | 2 | Bart | Pitt | (231) 465-3497 | example@sqldat.com | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | example@sqldat.com | | 6 | Burt | Tyson | (309) 565-0112 | example@sqldat.com | +---------+-----------+----------+----------------+--------------------+
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 | example@sqldat.com | | 6 | Burt | Tyson | (309) 565-0112 | example@sqldat.com | +---------+-----------+----------+----------------+--------------------+
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 | example@sqldat.com | +---------+-----------+----------+----------------+--------------------+
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 | example@sqldat.com | +---------+-----------+----------+----------------+--------------------+
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 | example@sqldat.com | | 2 | Bart | Pitt | (231) 465-3497 | example@sqldat.com | | 5 | Woody | Eastwood | (308) 555-0112 | example@sqldat.com | | 6 | Burt | Tyson | (309) 565-0112 | example@sqldat.com | +---------+-----------+----------+----------------+--------------------+
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.