Cum funcționează
LIKE și cele două caractere speciale
LIKE compară un text cu un șablon, nu cu o valoare exactă. Are două caractere cu înțeles special:
| Caracter |
Înseamnă |
Exemplu |
Potrivește |
% |
orice șir, inclusiv gol |
'A%' |
AlexRo, AnaPlays, A |
_ |
exact un caracter |
'A_ex%' |
AlexRo, dar nu AAlex |
Deci „începe cu A" = LIKE 'A%'. Variantele vecine, care se confundă:
| Șablon |
Ce găsește |
'A%' |
începe cu A |
'%A' |
se termină cu A |
'%A%' |
conține A oriunde |
'A' |
exact litera A, nimic altceva |
În Access, caracterul pentru „orice șir" e *, nu %: WHERE username LIKE "A*". Cine exersează
în Access și dă examenul pe hârtie în SQL standard trebuie să știe amândouă.
Alternativa fără LIKE, cu funcții de text:
WHERE SUBSTR(username, 1, 1) = 'A'
Aceeași funcție SUBSTR folosită la CNP în
problema #124.
Litera mare sau mică — depinde de sistem
LIKE 'A%' nu găsește alexRo în Oracle (comparație sensibilă la caz), dar îl găsește în SQLite și în
Access (insensibile, implicit). Dacă vrei un răspuns care nu depinde de sistem:
WHERE UPPER(username) LIKE 'A%'
Enunțul scrie explicit litera 'A' cu majusculă, iar username-urile din date încep cu majusculă, deci
forma simplă e suficientă aici. Merită totuși știut de ce merge.
De ce LEFT JOIN la b)
Același motiv ca la problema #154: dintre jucătorii cu
username care începe cu A, unul poate să nu aibă niciun joc înregistrat. Cu INNER JOIN, la a) apar
trei jucători și la b) doar doi — două răspunsuri care se contrazic, fără nicio eroare. Pe datele de
test, exact asta se întâmplă.
Greșeli frecvente
LIKE '%A' — găsește username-urile care se termină cu A. Inversul cerinței.
LIKE '%A%' — găsește orice username care conține un A, oriunde (DarkKnight nu, dar
ZenMasterA da).
WHERE username = 'A%' — cu =, % e un caracter obișnuit: caută username-ul literal A%.
Zero rânduri.
LIKE "A*" în SQL standard — sintaxa Access. În Oracle, ghilimelele duble denumesc un
identificator, nu un șir: eroare.
INNER JOIN la b) — pierzi jucătorii fără jocuri, deși la a) apar.
LIKE 'a%' — în Oracle nu potrivește AlexRo. Zero rânduri, fără eroare.