sql >> Databasteknik >  >> RDS >> MariaDB

Hur LIKE-operatören fungerar i MariaDB

I MariaDB, LIKE operatorn låter dig göra mönstermatchning. Det avgör om en specifik teckensträng matchar ett specificerat mönster. Den returnerar antingen 1 (TRUE) eller 0 (FALSK).

Ett mönster kan innehålla vanliga tecken, såväl som % och _ jokertecken.

Dessa jokertecken förklaras i följande tabell.

Jokertecken Beskrivning
% Matchar en sträng med noll eller fler tecken. Det kan användas som antingen ett prefix eller ett suffix, och det kan också användas i mitten av en sträng.
_ Matchar vilket enskilt tecken som helst.

Syntax

Syntaxen ser ut så här:

expr LIKE pat [ESCAPE 'escape_char']

Exempel

Anta att vi har följande tabell:

SELECT * FROM Pets;

Resultat:

+-------+-----------+---------+---------+------------+
| 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       |
+-------+-----------+---------+---------+------------+

Här är ett exempel för att visa hur LIKE operatören fungerar.

SELECT *
FROM Pets
WHERE PetName LIKE 'F%';

Resultat:

+-------+-----------+---------+---------+------------+
| 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 |
+-------+-----------+---------+---------+------------+

I det här exemplet använde jag LIKE operatorn i kombination med % jokerteckenoperatör för att returnera husdjur vars namn börjar med bokstaven F .

Skaftkänslighet

LIKE utför skiftlägesokänsliga delsträngsmatchningar om sorteringen för uttrycket och mönstret är skiftlägesokänslig.

Därför kan vi ändra det föregående exemplet till att använda en liten f , och fortfarande få samma resultat:

SELECT *
FROM Pets
WHERE PetName LIKE 'f%';

Resultat:

+-------+-----------+---------+---------+------------+
| 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 |
+-------+-----------+---------+---------+------------+

Vi kan dock tvinga fram en skiftlägeskänslig matchning genom att använda COLLATE sats med en binär sammanställning. Alternativt kan du använda CAST() att tvinga den till en binär sträng.

Exempel:

SELECT *
FROM Pets
WHERE PetName LIKE 'f%' COLLATE utf8_bin;

Resultat:

Empty set (0.000 sec)

Inga resultat returneras.

Men om vi ändrar det till en versal F :

SELECT *
FROM Pets
WHERE PetName LIKE 'F%' COLLATE utf8_bin;

Resultat:

+-------+-----------+---------+---------+------------+
| 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 |
+-------+-----------+---------+---------+------------+

Vi får tre matcher, som väntat.

Numeriska argument

Numeriska argument tvingas till binära strängar.

SELECT * 
FROM Pets 
WHERE PetId LIKE 7;

Resultat:

+-------+-----------+---------+---------+------+
| PetId | PetTypeId | OwnerId | PetName | DOB  |
+-------+-----------+---------+---------+------+
|     7 |         3 |       2 | Bark    | NULL |
+-------+-----------+---------+---------+------+

Datum

Här är ett exempel som matchar året från ett datum:

SELECT * 
FROM Pets 
WHERE DOB LIKE '2020%';

Resultat:

+-------+-----------+---------+---------+------------+
| 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 |
+-------+-----------+---------+---------+------------+

Du kan också använda LIKE operatorn mot resultatet av datumfunktioner, såsom DAYNAME() , MONTHNAME() , etc.

SELECT * 
FROM Pets 
WHERE MONTHNAME(DOB) LIKE 'Nov%';

Resultat:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     1 |         2 |       3 | Fluffy  | 2020-11-20 |
|     5 |         1 |       1 | Tweet   | 2020-11-28 |
+-------+-----------+---------+---------+------------+

_ Jokertecken-operatör

Understrecket (_ ) jokerteckenoperator matchar vilket enskilt tecken som helst.

Exempel:

SELECT *
FROM Pets
WHERE PetName LIKE '_e%';

Resultat:

+-------+-----------+---------+---------+------------+
| PetId | PetTypeId | OwnerId | PetName | DOB        |
+-------+-----------+---------+---------+------------+
|     2 |         3 |       3 | Fetch   | 2019-08-16 |
|     8 |         2 |       4 | Meow    | NULL       |
+-------+-----------+---------+---------+------------+

I det här fallet matchade vi husdjursnamn där det andra tecknet är en e .

Escape-karaktären

Ibland kan du hamna i den situationen att du behöver söka efter ett understreck eller ett procenttecken. I sådana fall kan du använda ett omvänt snedstreck (\ ) för att undkomma dessa tecken. Detta kommer att förhindra att de tolkas som jokertecken.

Anta att vi har följande tabell:

SELECT * FROM Owners;

Resultat:

+---------+-----------+----------+----------------+--------------------+
| 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]   |
+---------+-----------+----------+----------------+--------------------+

Observera att Ägare 2 (Bart) har en e-postadress som innehåller ett understreck.

Här är ett exempel på vad som händer när vi inte gör det undkomma ett understreck:

SELECT * FROM Owners
WHERE Email LIKE 'b_%';

Resultat:

+---------+-----------+----------+----------------+--------------------+
| OwnerId | FirstName | LastName | Phone          | Email              |
+---------+-----------+----------+----------------+--------------------+
|       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
|       6 | Burt      | Tyson    | (309) 565-0112 | [email protected]   |
+---------+-----------+----------+----------------+--------------------+

I det här fallet matchade det två rader. I det här fallet spelade det ingen roll vad den andra karaktären var – den matchade alla karaktär. Att den första raden innehåller ett understreck för det andra tecknet är bara en slump. Det hade matchat även om det var något annat.

Men tänk om vi bara ville matcha de e-postadresser som har ett faktiskt understreck som andra tecken?

Det är där flyktkaraktären kommer in.

SELECT * FROM Owners
WHERE Email LIKE 'b\_%';

Resultat:

+---------+-----------+----------+----------------+--------------------+
| OwnerId | FirstName | LastName | Phone          | Email              |
+---------+-----------+----------+----------------+--------------------+
|       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
+---------+-----------+----------+----------------+--------------------+

Nu får vi bara en rad – raden som innehåller understrecket som andra tecken.

Ändra Escape-karaktären

Det är möjligt att ändra flyktkaraktären. Du kan göra detta med ESCAPE argument.

Exempel:

SELECT * FROM Owners
WHERE Email LIKE 'b*_%' ESCAPE '*';

Resultat:

+---------+-----------+----------+----------------+--------------------+
| OwnerId | FirstName | LastName | Phone          | Email              |
+---------+-----------+----------+----------------+--------------------+
|       2 | Bart      | Pitt     | (231) 465-3497 | [email protected] |
+---------+-----------+----------+----------------+--------------------+

I det här fallet tilldelade jag asterisken (* ) som flykttecken.

Detta kan vara särskilt praktiskt när du behöver använda omvänt snedstreck för andra ändamål, som att koda specialtecken. I sådana fall kan du behöva "dubbel-escape" dessa karaktärer, vilket kan bli förvirrande. Att ändra flyktkaraktären kan därför hjälpa i sådana situationer.

NULL-värden

Procentandelen (% ) jokertecken matchar vad som helst – nästan. En sak som inte matchar är NULL .

SELECT * FROM Owners
WHERE Email LIKE '%';

Resultat:

+---------+-----------+----------+----------------+--------------------+
| 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]   |
+---------+-----------+----------+----------------+--------------------+

I vår tabell finns det två rader med NULL i Email kolumn, men de returneras inte här.

Prestanda

Frågor som innehåller LIKE operatorn kan köras mycket långsammare än andra frågor, och du bör förmodligen undvika att använda LIKE operatör om du inte verkligen behöver det. Med hjälp av % operator som prefix kan vara särskilt långsam.

Därmed inte sagt att du inte ska använda det alls. LIKE operatör är en integrerad del av SQL, och du kommer att stöta på många scenarier där det kommer att vara det enda alternativet (eller åtminstone det bästa alternativet).

Koden NOT LIKE Operatör

Du kan också använda NOT LIKE för att testa om en sträng inte gör det matcha ett mönster.


  1. Möjliga sätt att åtgärda problem med korruption av SQL Server-metadata

  2. Så här använder du Summa, Avg och Count i Select Statement - SQL Server / TSQL Tutorial Del 128

  3. Skillnad mellan språk sql och språk plpgsql i PostgreSQL-funktioner

  4. Jag får ett Ett försök gjordes att ladda ett program med ett felaktigt formatfel på ett SQL Server-replikeringsprojekt