I lektionen Afgrænsning med WHERE lærte du at sammenligne kolonner med tekstværdier. Som eksempel WHERE Navn = ‘Min Bix’. Du vil ofte have behov for at afgrænse ud fra en del af teksten i stedet for hele teksten, og det kan du gøre med operatoren LIKE og jokertegn som f.eks. %-tegnet. Med LIKE blive dine forespørgsler straks meget mere fleksible.
Sådan bruger du LIKE i SQL
Operatoren LIKE er sammenlignelig med lighedstegnet (=). Den helt store forskel mellem lig med (=) og LIKE er, at LIKE tillader brug af jokertegn (wildcard). Du skriver LIKE mellem Kolonnenavn og værdi i WHERE-delen af din forespørgsel.
SELECT <kolonne1, kolonne2, ...> FROM Tabel
WHERE Kolonne LIKE <værdi>
Uden brug af wildcard opfører LIKE sig som lig med. Der er dog en undtagelse, som afhænger af den sprogopsætning databasen er konstrueret med (indstillingen Collation). Hvis databasen skelner mellem store og små bogstaver, altså hvis man har valgt Case Sensitive, så vil LIKE opføre sig som om, der ikke er forskel på store/små bogstaver. SQLKursus-databasen er Case Insensitive, og der skelnes ikke mellem store og små bogstaver i betingelserne. Derfor opfører LIKE og = sig ens, så længe der ikke bruges jokertegn.
Denne forespørgsel:
SELECT * FROM Kunde
WHERE Navn LIKE 'Min Bix'
giver samme resultat som:
SELECT * FROM Kunde
WHERE Navn = 'Min Bix'
og i vores database giver disse to sætninger samme resultat som de to ovenstående:
SELECT * FROM Kunde
WHERE Navn LIKE 'min bix'
SELECT * FROM Kunde
WHERE Navn = 'min bix'
Brug af % som jokertegn i SQL
Som du skal se lidt senere i denne lektion, er der flere jokertegn. Men % er nok den mest anvendte. %-tegnet er en joker (også kaldet wildcard), som matcher fra nul til alle tegn i en tekst.
Find Bobleplast i Varetabellen:
SELECT * FROM Vare
WHERE Varebetegnelse LIKE 'Bobleplast%'
%-tegnet sørger for at vise alle rækker, hvor værdien i Varebetegnelse-kolonnen starter med Bobleplast.
Du kan skrive jokertegn flere gange, hvis du eksempelvis ikke er sikker på skrivemåden. Find varer med plast i navnet:
SELECT * FROM Vare
WHERE Varebetegnelse LIKE '%plast%'
Resultatet er det samme som ovenfor.
Vi vil gerne vide, hvilke emballager vi har, som er 30 cm på et leddene. Det kan f.eks. gøres sådan her:
SELECT * FROM Vare
WHERE Varebetegnelse LIKE '%30%'
Du kan selvfølgelig bruge jokertegn inde i teksten og ikke kun i starten og slutningen af teksten. Her leder vi efter kunden, der hedder noget med Ting og Sager:
SELECT * FROM Kunde
WHERE Navn LIKE 'Ting%Sager%'
Der er andre jokertegn i SQL
Jokertegnet % er meget praktisk at bruge i langt de fleste tilfælde. Der er dog andre jokertegn, som du kan bruge til at præcisere dine betingelser i forespørgslen.
Dette er listen af gyldige jokertegn, der kan anvendes i SQL Server:
% – erstatter nul til flere tegn.
_ – erstatter præcist ét tegn.
[ ] – erstatter ét tegn ud af de mulige mellem [ ]
[^ ] – erstatter ét tegn, dog ikke tegn mellem [ ]
Du har set eksempler med %, lad os prøve at lege lidt med understregningstegnet _. Dette tegn erstatter præcist ét tegn. Find alle postnumre, der ender med 800, og som er på fire tegn i alt.
SELECT * FROM Kunde
WHERE Postnr LIKE '_800'
Hvis der var tre- eller femcifrede postnumre i tabellen, ville de ikke blive fundet i dette tilfælde. Hvis du havde brugt %-tegn, ville de tre- og femcifrede komme med.
Ved at bruge [ ] kan du søge efter ét tegn ud af de mulige, som du angiver mellem [ ]. Dette er meget nyttigt, når du leder efter tekster, hvor et bestemt tegn optræder.
Find kundeemner med I/S eller A/S i deres navn:
SELECT * FROM Kundeemner
WHERE Navn LIKE '%[ai]/S%'
Læs betingelsen som: Navn skal ligne et vilkårligt antal tegn (%), fulgt af et af bogstaverne A eller I ([ai]), fulgt af tegnene /S efterfulgt af et vilkårligt antal tegn (%).
Brug ^ inde i [ ] for at udelukke de pågældende tegn. Denne forespørgsel finder kunder, hvor byen ikke starter med K:
SELECT * FROM Kunde
WHERE Bynavn LIKE '[^k]%'
Når du begynder at udelukke tegn, kan du nemt blive fanget i en logisk fælde. Se denne betingelse: ‘%[^b]%’ – vil byen Viborg komme med eller ej?
Svaret kommer med det samme! Viborg kommer med. Betingelsen skal læses som: et vilkårligt antal tegn, efterfulgt af et tegn, som ikke er ‘b’, dernæst et vilkårligt antal tegn. Denne betingelse vil være sand for alle tekster der er mindst et tegn langt. Den eneste tekst, der bliver udelukket er teksten ‘b’ – altså en tekst, hvor det eneste tegn er ‘b’.
Brug ESCAPE til at søge efter jokertegn
Du kan have behov for både at anvende jokertegn og derfor bruge LIKE-operatoren, men samtidig finde tekster, hvor jokertegnet i sig selv er en del af teksten. Til det formål kan du bruge ESCAPE-kommandoen til at fortælle SQL Server, at et bestemt tegn ophæver det efterfølgende tegn. ESCAPE skal efterfølges af ét tegn i enkeltapostroffer. Der er frit valg blandt alle tegn, og der er ikke noget standardtegn.
Denne forespørgsel finder kundeemner, hvor sidste tegn er ‘%’:
SELECT * FROM Kundeemner
WHERE Navn LIKE '%#%' ESCAPE '#'
Jeg har valgt # som escape-tegn. Det betyder, at tegnet i betingelsen lige efter # skal opfattes som tegnet selv (%) og ikke som et jokertegn.
Prøv selv
- Find alle kunder, hvor telefonnummer:
- Starter med 72.
- Ender med 5.
- Indeholder 7, dog ikke i starten eller slutningen.
- Andet ciffer er 3.
- Ender på 0 eller 5.
- Find alle adresser (Adresse1), der slutter på tal.
- Og dem, der ikke slutter med tal.
- Find alle kundeemner, som har enten A/S, I/S eller ApS i deres navn.