Filtrera data med predikat

Slutförd

De enklaste SELECT-uttrycken med endast SELECT- och FROM-satser utvärderar varje rad i en tabell. Med hjälp av en WHERE-sats definierar du villkor som avgör vilka rader som ska bearbetas och potentiellt minska resultatuppsättningen.

Strukturen för WHERE-satsen

WHERE-satsen består av ett eller flera sökvillkor, som var och en måste utvärderas till TRUE, FALSE eller "unknown" för varje rad i tabellen. Rader returneras endast när WHERE-satsen utvärderas som TRUE. De enskilda villkoren fungerar som filter på data och kallas "predikater". Varje predikat innehåller ett villkor som testas, vanligtvis med hjälp av de grundläggande jämförelseoperatorerna:

  • = (lika med)
  • <> (inte lika med)
  • > (större än)
  • >= (större än eller lika med)
  • < (mindre än)
  • <= (mindre än eller lika med)

Följande fråga returnerar till exempel alla produkter med värdet ProductCategoryID 2:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;

På samma sätt returnerar följande fråga alla produkter med en ListPrice som är mindre än 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;

ÄR NULL/ÄR INTE NULL

Du kan också enkelt filtrera för att tillåta eller exkludera "okända" eller NULL-värden med IS NULL eller IS NOT NULL.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;

Flera villkor

Flera predikat kan kombineras med OPERATORERNA AND och OR och parenteser. SQL Server bearbetar dock endast två villkor i taget. Alla villkor måste vara TRUE när du ansluter flera villkor med AND-operatorn. När du använder OR-operatorn för att ansluta två villkor kan en eller båda vara TRUE för resultatuppsättningen.

Följande fråga returnerar till exempel produkten i kategori 2 som kostar mindre än 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    AND ListPrice < 10.00;

AND-operatorer bearbetas före OR-operatorer, såvida inte parenteser används. Bästa praxis är att använda parenteser när du använder fler än två predikat. Följande fråga returnerar produkter i kategori 2 ELLER 3 OCH kostar mindre än 10,00:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
    AND (ListPrice < 10.00);

Jämförelseoperatorer

Transact-SQL innehåller jämförelseoperatorer som kan förenkla WHERE-satsen.

IN

IN-operatorn är en genväg för flera likhetsvillkor för samma kolumn som är ansluten till OR. Det är inget fel med att använda flera ELLER-villkor i en fråga, som i följande exempel:

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
    OR ProductCategoryID = 3
    OR ProductCategoryID = 4;

Att använda IN är dock tydligt och koncist, och frågans prestanda påverkas inte.

SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);

MELLAN

BETWEEN är en annan genväg som kan användas vid filtrering för en övre och nedre gräns för värdet i stället för att använda två villkor med AND-operatorn. Följande två frågor är likvärdiga:

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;

BETWEEN-operatorn använder inkluderande gränsvärden. Produkter med ett pris på antingen 1,00 eller 10,00 skulle inkluderas i resultatet. BETWEEN är också användbart när du frågar efter datumfält. Följande fråga innehåller till exempel alla produktnamn som ändrats mellan 1 januari 2012 och 31 december 2012:

SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';

ProductName

Ändringsdatum

Mountainbikestrumpor, M

2012-01-01 00:00:00.000

HL Mountain Frame - Silver, 42

2012-03-05 00:00:00.000

HL Mountain Frame - Silverfärgad, 38

2012-08-29 00:00:00.000

Mountain-100 Silver, 38

2012-12-31 00:00:00.000

Men eftersom vi inte anger något tidsintervall returneras inga resultat efter 2012-12-31 00:00:00.000. För att kunna inkludera datum och tid korrekt måste vi inkludera tiden i predikatet:

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äggande jämförelseoperatorer som Större än (>) och Lika med (=) är också korrekta vid enbart filtrering efter datum.

SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01' 
    AND ModifiedDate < '2013-01-01';

Tycka om

Den slutliga jämförelseoperatorn kan bara användas för teckendata och gör att vi kan använda jokertecken och mönster för reguljära uttryck. Wildcards låter oss specificera delar av strängar. Du kan till exempel använda följande fråga för att returnera alla produkter med namn som innehåller ordet "mountain":

SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';

Jokertecknet % representerar valfri sträng med 0 eller fler tecken, så resultatet inkluderar produkter med ordet "berg" var som helst i namnet, så här:

Name

Listpris

Mountainbikestrumpor, M

9,50

Mountainbikestrumpor, L

9,50

HL Mountain Frame - Silver, 42

1364.0

HL Mountain Frame - Svart, 42

1349.60

HL Mountain Frame - Silverfärgat, 38

1364.50

Mountain-100 Silver, 38

3399.99

Du kan använda jokertecknet _ (understreck) för att representera ett enskilt tecken, så här:

SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';

Följande resultat inkluderar endast produkter som börjar med "Mountain Bike Socks" och ett enda tecken efter:

ProductName

Listpris

Mountainbikestrumpor, M

9,50

Mountainbikestrumpor, L

9,50

Du kan också definiera komplexa mönster för strängar som du vill hitta. Följande fråga sökte till exempel efter produkter med ett namn som börjar med "Mountain-", följt av:

  • tre tecken mellan 0 och 9
  • ett blanksteg
  • valfri sträng
  • ett kommatecken
  • ett blanksteg
  • två tecken mellan 0 och 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

Resultatet från den här frågan kan se ut ungefär så här:

ProductName

Listpris

Mountain-100 Silver, 38

3399.99

Mountain-100 Silver, 42

3399.99

Mountain-100 Svart, 38

3399.99

Mountain-100 svart, 42

3399.99

Mountain-200 Silver, 38

2319.99

Mountain-200 Silver, 42

2319.99

Mountain-200 Svart, 38

2319.99

Berg-200 Svart, 42

2319.99