SQL IN och LIKE - välj rätt filter för värden och text

22 oktober 2026

En SQL-fråga för att analysera apotekets försäljning. Frågan handlar om att beräkna total försäljning per tillverkare, med fokus på läkemedel som innehåller "Relief".

Du ska filtrera en lista med webbsidor efter kategori, men vill samtidigt hitta titlar som innehåller ett visst ord. SQL:s IN väljer rader med värden ur en lista, medan mönstermatchning oftast görs med LIKE, men NULL-värden och databasmotorer kan ändra vad resultatet blir.

pgAdmin 4 visar en tabell med anställda. En SQL-fråga hämtar en post där id är 1.

Välj IN för värdelistor och LIKE för textmönster

  • IN testar om ett värde finns bland angivna alternativ eller i en underfråga.
  • LIKE söker efter textmönster med jokertecken.
  • % står för noll eller flera tecken och _ för ett tecken i vanliga LIKE-mönster.
  • NOT IN kan ge oväntat resultat om listan eller underfrågan innehåller NULL.
  • SQL Server, PostgreSQL och andra databaser kan skilja sig åt i detaljerna för mönster.

IN matchar hela värden, inte delar av text

Om en innehållssida ska tillhöra kategorin “design”, “analys” eller “guider” passar IN bra. Villkoret jämför kolumnvärdet med varje värde i listan och tar med raden när det blir en exakt träff. Microsoft Learn beskriver också IN som en jämförelse mot en lista eller resultatet från en underfråga.

SELECT title, category
FROM pages
WHERE category IN ('design', 'analys', 'guider');

Här behöver `category` ha ett av de angivna värdena. En sida med kategorin `designsystem` matchar inte `design`, eftersom IN inte letar efter en textbit inuti ett längre värde. Det är skillnaden som lättast leder till fel filter.

LIKE hittar ett mönster inne i texten

En titel kan innehålla ordet “formulär” utan att hela titeln är just det ordet. Då använder du LIKE och placerar procenttecken där valfria tecken får förekomma. I många SQL-system står `%` för noll eller fler tecken och `_` för exakt ett tecken; PostgreSQLs dokumentation om mönstermatchning beskriver LIKE och dess mönsterregler.

SELECT title
FROM pages
WHERE title LIKE '%formulär%';

Procenttecknet på båda sidor gör att ordet kan ligga var som helst i titeln. Byt till `LIKE 'formulär%'` om ordet ska stå först, eller `LIKE '%formulär'` om det ska stå sist. Utan jokertecken blir sökningen i praktiken en jämförelse med hela texten, så välj mönster efter hur innehållet faktiskt ser ut.

Välj operator efter vad kolumnen innehåller

Det tydligaste beslutet kommer av att skilja mellan en avgränsad lista och en fri textkolumn. En kategorikolumn kan filtreras med IN, medan en sidtitel eller beskrivning ofta behöver LIKE. Jag tycker att den uppdelningen är lättare att hålla ren än att försöka pressa in textmönster i en värdelista.

Situation Trolig orsak eller effekt Gör så här
Kategorin ska vara exakt `design` eller `guider` Fälten innehåller avgränsade kategorivärden Använd `category IN ('design', 'guider')`
Titeln ska innehålla `design` någonstans Texten kan ha andra ord före eller efter Använd `title LIKE '%design%'`
En värdelista har många alternativ eller kommer från en tabell En lång lista blir svår att ändra och överblicka Använd en underfråga med IN eller koppla tabeller med JOIN
Du söker efter ett ord i en kolumn där NULL förekommer NULL är ett okänt värde, inte tom text Hantera NULL separat, exempelvis med `IS NULL` eller `COALESCE`, beroende på behov

Om etiketter lagras som en kommaseparerad sträng, exempelvis `design,guider`, kan LIKE ge falska träffar och göra det svårt att hitta en enskild etikett. För återanvändbara kategorier är en separat relationstabell oftast bättre: då kan IN eller JOIN jämföra riktiga värden i stället för text som råkar innehålla dem.

NOT IN kan filtrera bort mer än du tänkt

En underfråga med NULL kan göra att `NOT IN` inte returnerar de rader du väntar dig. SQL behandlar jämförelsen med NULL som okänd, och då kan ett villkor som verkar betyda “uteslut de här kategorierna” i praktiken ge ett tomt resultat. Microsoft varnar uttryckligen för den här effekten i dokumentationen om IN.

SELECT title
FROM pages
WHERE category NOT IN (
  SELECT category
  FROM blocked_categories
);

Om `blocked_categories.category` innehåller NULL kan resultatet överraska. Kontrollera först om underfrågan ger NULL och filtrera bort det om det inte ska räknas, till exempel med `WHERE category IS NOT NULL` i underfrågan. Om NULL i stället ska behålla eller utesluta vissa sidor behöver det uttryckas separat, inte lämnas åt en implicit jämförelse.

Jokertecken och syntax skiljer sig mellan databaser

En fråga som fungerar i en databas kan behöva justeras i en annan. I SQL Server har LIKE bland annat stöd för hakparentesmönster, medan PostgreSQL erbjuder `ILIKE` som en egen, skiftlägesokänslig variant; Microsofts dokumentation om LIKE i Transact-SQL visar dessutom hur jokertecken kan behandlas som vanliga tecken med särskild syntax.

Om du bara behöver grundläggande matchning med `%` och `_` är LIKE ofta lätt att flytta mellan databaser. Behöver du ignorera stora och små bokstäver, söka efter bokstavliga procenttecken eller använda avancerade uttryck, kontrollera syntaxen för just din motor. Testa också med värden som innehåller mellanslag, understreck och procenttecken, eftersom de kan bete sig som mönstertecken i stället för vanlig text.

En enkel tumregel håller frågan begriplig

För en bestämd uppsättning kategorier väljer du IN. För ett textmönster väljer du LIKE, och när du utesluter värden med NOT IN granskar du NULL i underfrågan innan du litar på resultatet. Då slipper du låta en operatör göra ett jobb den inte är byggd för.

Om samma textfilter återkommer på många sidor är det ofta ett tecken på att kategorier eller taggar bör lagras som separata värden i stället för inuti en längre text. En tydlig datamodell gör filtreringen enklare att skriva och resultaten enklare att förstå.

Vanliga frågor

Använd IN när kategorin ska matcha ett av flera exakta värden, till exempel category IN ('design', 'guider'). LIKE passar när du söker efter ett textmönster, exempelvis en titel som innehåller ett visst ord. IN hittar inte en del av ett längre värde: kategorin designsystem matchar alltså inte design.
I vanliga LIKE-mönster står % för noll eller flera tecken och _ för exakt ett tecken. Mönstret '%formulär%' hittar ordet var som helst i texten, medan 'formulär%' söker efter text som börjar med ordet. Utan jokertecken jämförs i praktiken hela texten.
SQL behandlar jämförelser med NULL som okända. Om underfrågan till NOT IN returnerar NULL kan resultatet därför bli tomt eller skilja sig från vad du väntar dig. Kontrollera om underfrågan innehåller NULL och filtrera bort värdet med exempelvis WHERE category IS NOT NULL om det inte ska ingå.
Grundläggande mönster med % och _ fungerar ofta på liknande sätt, men detaljer och extra funktioner varierar. SQL Server har bland annat stöd för hakparentesmönster, medan PostgreSQL erbjuder ILIKE för skiftlägesokänslig matchning. Kontrollera syntaxen för din databasmotor om du behöver hantera bokstavliga jokertecken eller ignorera skillnaden mellan stora och små bokstäver.
Betygsätt artikeln

Genomsnitt: 0.0 / 5 · 0 betyg

Taggar

null-värden in-operatorn like-operatorn jokertecken
Kommentarer (0)
Lägg till en kommentar