Filtrer data med prædikater
De enkleste SELECT-sætninger med kun SELECT- og FROM-delsætninger evaluerer hver række i en tabel. Ved hjælp af en WHERE-delsætning definerer du betingelser, der bestemmer, hvilke rækker der behandles, og reducerer muligvis resultatsættet.
Strukturen af WHERE-delsætningen
WHERE-delsætningen består af en eller flere søgebetingelser, som hver især skal evalueres til TRUE, FALSE eller 'unknown' for hver række i tabellen. Rækker returneres kun, når WHERE-delsætningen evalueres som TRUE. De enkelte betingelser fungerer som filtre på dataene og kaldes "prædikater". Hvert prædikat indeholder en betingelse, der testes, normalt ved hjælp af de grundlæggende sammenligningsoperatorer:
- = (er lig med)
- <> (ikke lig med)
- > (større end)
- >= (større end eller lig med)
- < (mindre end)
- <= (mindre end eller lig med)
Følgende forespørgsel returnerer f.eks. alle produkter med en ProductCategoryID-værdi på 2:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
På samme måde returnerer følgende forespørgsel alle produkter med en ListPrice mindre end 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
ER NULL/ER IKKE NULL
Du kan også nemt filtrere for at tillade eller udelade værdierne 'ukendt' eller NULL ved hjælp af IS NULL eller IS NOT NULL.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
Flere betingelser
Flere prædikater kan kombineres med operatorerne AND og OR og med parenteser. SQL Server behandler dog kun to betingelser ad gangen. Alle betingelser skal være TRUE, når der oprettes forbindelse mellem flere betingelser og operatoren AND. Når du bruger operatoren OR til at forbinde to betingelser, kan den ene eller begge være TRUE for resultatsættet.
Følgende forespørgsel returnerer f.eks. produkt i kategori 2, der koster mindre end 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
AND-operatorer behandles før OR-operatorer, medmindre der bruges parenteser. Til bedste praksis skal du bruge parenteser, når du bruger mere end to prædikater. Følgende forespørgsel returnerer produkter i kategori 2 ELLER 3 OG koster mindre end 10,00:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
Sammenligning operatorer
Transact-SQL indeholder sammenligningsoperatorer, der kan hjælpe med at forenkle WHERE-delsætningen.
IN
Operatoren IN er en genvej til flere lighedsbetingelser for den samme kolonne, der er forbundet med OR. Der er intet galt i at bruge flere OR-betingelser i en forespørgsel som i følgende eksempel:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
Brugen af IN er dog klar og præcis, og forespørgslens ydeevne påvirkes ikke.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
MELLEM
BETWEEN er en anden genvej, der kan bruges, når der filtreres efter en øvre og nedre grænse for værdien i stedet for at bruge to betingelser sammen med operatoren AND. Følgende to forespørgsler svarer til hinanden:
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;
Operatoren BETWEEN bruger inklusive grænseværdier. Produkter med en pris på enten 1,00 eller 10,00 medtages i resultaterne. BETWEEN er også nyttigt, når du forespørger datofelter. Følgende forespørgsel indeholder f.eks. alle produktnavne, der er ændret mellem den 1. januar 2012 og den 31. december 2012:
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ProductName
Ændringsdato
Mountainbike Sokker, M
2012-01-01 00:00:00.000
HL Mountain Frame - Sølv, 42
2012-03-05 00:00:00.000
HL Mountain Frame - Sølv, 38
2012-08-29 00:00:00.000
Bjerg-100 Sølv, 38
2012-12-31 00:00:00.000
Men da vi ikke angiver et tidsinterval, returneres der ingen resultater efter 2012-12-31 00:00:00.000. Hvis du vil medtage dato og klokkeslæt nøjagtigt, skal vi inkludere klokkeslættet i prædikatet:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';
Grundlæggende sammenligningsoperatorer som f.eks. Greater Than (>) og Equals (=) er også nøjagtige, når der kun filtreres efter dato:
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
Synes om
Den endelige sammenligningsoperator kan kun bruges til tegndata og giver os mulighed for at bruge jokertegn og mønstre for regulære udtryk. Jokertegn giver os mulighed for at angive delvise strenge. Du kan f.eks. bruge følgende forespørgsel til at returnere alle produkter med navne, der indeholder ordet "bjerg":
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
Jokertegnet % repræsenterer en streng på 0 eller flere tegn, så resultaterne omfatter produkter med ordet "bjerg" hvor som helst i deres navn, f.eks.:
Name
Listepris
Mountainbike Sokker, M
9,50
Mountainbike Socks, L
9,50
HL Mountain Frame - Sølv, 42
1364.0
HL Mountain Frame - Sort, 42
1349.60
HL Mountain Frame - Sølv, 38
1364.50
Bjerg-100 Sølv, 38
3399.99
Du kan bruge jokertegnet _ (understregningstegn) til at repræsentere et enkelt tegn, f.eks.:
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
Følgende resultater omfatter kun produkter, der starter med "Mountain Bike Socks" og et enkelt tegn efter:
ProductName
Listepris
Mountainbike Sokker, M
9,50
Mountainbike Socks, L
9,50
Du kan også definere komplekse mønstre for strenge, du vil finde. Følgende forespørgsel søgte f.eks. efter produkter med et navn, der starter med "Mountain-", derefter efterfulgt af:
- tre tegn mellem 0 og 9
- et mellemrum
- en hvilken som helst streng
- et komma
- et mellemrum
- to tegn mellem 0 og 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
Resultaterne fra denne forespørgsel kan se nogenlunde sådan ud:
ProductName
Listepris
Bjerg-100 Sølv, 38
3399.99
Bjerg-100 Sølv, 42
3399.99
Bjerg-100 Sort, 38
3399.99
Bjerg-100 Sort, 42
3399.99
Bjerg-200 Sølv, 38
2319.99
Bjerg-200 Sølv, 42
2319.99
Mountain-200 Sort, 38
2319.99
Mountain-200 Sort, 42
2319.99