Adatok szűrése predikátumokkal

Befejeződött

A legegyszerűbb SELECT utasítások, amelyekben csak a SELECT és a FROM záradékok jelennek meg, egy tábla minden sorát kiértékelik. A WHERE záradék használatával olyan feltételeket határozhat meg, amelyek meghatározzák, hogy mely sorok lesznek feldolgozva, és potenciálisan csökkentik az eredményhalmazt.

A WHERE záradék felépítése

A WHERE záradék egy vagy több keresési feltételből áll, amelyek mindegyikének IGAZ, HAMIS vagy "ismeretlen" értékre kell kiértékelnie a táblázat egyes sorait. A sorok csak akkor lesznek visszaadva, ha a WHERE záradék IGAZ értéket ad vissza. Az egyes feltételek szűrőkként működnek az adatokon, és "predikátumok"-nak nevezik. Minden predikátum tartalmaz egy tesztelés alatt álló feltételt, amely általában az alapvető összehasonlító operátorokat használja:

  • = (egyenlő)
  • <> (nem egyenlő)
  • > (nagyobb, mint)
  • >= (nagyobb vagy egyenlő)
  • < (kisebb, mint)
  • <= (kisebb vagy egyenlő)

Az alábbi lekérdezés például az összes terméket visszaadja, amelynek ProductCategoryID értéke 2:

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

Hasonlóképpen, a következő lekérdezés az összes olyan terméket visszaadja, amelynek ListPrice értéke 10,00-nál kisebb:

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

IS NULL / IS NOT NULL

Az "ismeretlen" vagy "NULL" értékek engedélyezéséhez vagy kizárásához is egyszerűen szűrhet a NULL vagy a NEM NULL érték használatával.

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

Több feltétel

Több predikátum kombinálható az AND és OR operátorokkal, zárójelekkel. Az SQL Server azonban egyszerre csak két feltételt dolgoz fel. Ha több feltételt csatlakoztat az AND operátorhoz, minden feltételnek IGAZ értékűnek kell lennie. Ha az OR operátort két feltétel csatlakoztatására használja, az eredményhalmazhoz egy vagy mindkettő IGAZ lehet.

Az alábbi lekérdezés például a 2. kategóriába tartozó terméket adja vissza, amely 10,00-nál kisebb költséggel jár:

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

AZ AND operátorok feldolgozása az OR operátorok előtt történik, kivéve, ha zárójeleket használnak. Ajánlott eljárásként használjon zárójeleket kétnél több predikátum használatakor. A következő lekérdezés a 2 . vagy a 3 . kategóriába tartozó termékeket adja vissza, és 10,00-nál kisebb költséggel jár:

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

Összehasonlító operátorok

A Transact-SQL olyan összehasonlító operátorokat tartalmaz, amelyek segíthetnek leegyszerűsíteni a WHERE záradékot.

BAN

Az IN operátor az OR oszlophoz csatlakoztatott ugyanazon oszlop több egyenlőségi feltételének parancsikonja. Nincs semmi baj, ha több VAGY feltételt használ egy lekérdezésben, ahogy az alábbi példában is látható:

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

Az IN használata azonban egyértelmű és tömör, és a lekérdezés teljesítményét nem befolyásolja.

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

KÖZÖTT

A BETWEEN egy másik parancsikon, amely az AND operátorral való két feltétel használata helyett használható az érték felső és alsó határának szűrésére. A következő két lekérdezés egyenértékű:

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;

A BETWEEN operátor befogadó határértékeket használ. Az eredmények az 1,00 vagy 10,00 árú termékeket tartalmazzák. A BETWEEN a dátummezők lekérdezésekor is hasznos. A következő lekérdezés például a 2012. január 1. és 2012. december 31. között módosított összes terméknevet tartalmazza:

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

ProductName

MódosításDátuma

Mountain bike-os zokni, M

2012-01-01 00:00:00.000

HL Mountain Frame - Ezüst, 42

2012-03-05 00:00:00.000

HL Mountain Frame - Ezüst, 38

2012-08-29 00:00:00.000

Mountain-100 ezüst, 38

2012-12-31 00:00:00.000

Mivel azonban nem határozunk meg időtartományt, a rendszer nem ad vissza eredményt 2012.12.31. 00:00:00.000 után. A dátum és az idő pontos belefoglalásához be kell foglalnunk az időt a predikátumba:

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';

Az olyan alapszintű összehasonlító operátorok, mint a Nagyobb (>) és az Egyenlő (=) is pontosak, ha csak dátum szerint szűrnek:

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

SZERET

A végső összehasonlító operátor csak karakteradatokhoz használható, és lehetővé teszi helyettesítő karakterek és reguláris kifejezésminták használatát. A helyettesítő karakterek lehetővé teszik a részleges sztringek megadását. Az alábbi lekérdezéssel például a "mountain" szót tartalmazó összes terméket visszaadhatja:

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

A % helyettesítő karakter bármilyen 0 vagy több karakterből álló sztringet jelöl, ezért az eredmények közé tartoznak a "mountain" szót tartalmazó termékek, bárhol a nevükben, például:

Név

listaár

Mountain bike-os zokni, M

9,50

Mountain bike-os zokni, L

9,50

HL Mountain Frame - Ezüst, 42

1364.0

HL Mountain Frame - Fekete, 42

1349.60

HL Mountain Frame - Ezüst, 38

1364.50

Mountain-100 ezüst, 38

3399.99

A _ (aláhúzásjel) helyettesítő karakterrel egyetlen karaktert jelölhet, például a következőt:

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

A következő eredmények csak a "Mountain Bike Zokni" kezdetű termékeket és a következő karaktereket tartalmazzák:

ProductName

listaár

Mountain bike-os zokni, M

9,50

Mountain bike-os zokni, L

9,50

Összetett mintákat is meghatározhat a keresett sztringekhez. Az alábbi lekérdezés például olyan termékeket keresett, amelyek neve "Mountain-", majd következő:

  • három karakter 0 és 9 között
  • szóköz
  • bármely sztring
  • vessző
  • szóköz
  • két karakter 0 és 9 között
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

A lekérdezés eredményei a következőképpen nézhetnek ki:

ProductName

listaár

Mountain-100 ezüst, 38

3399.99

Mountain-100 ezüst, 42

3399.99

Mountain-100 Fekete, 38

3399.99

Mountain-100 fekete, 42

3399.99

Mountain-200 Silver, 38

2319.99

Mountain-200 Ezüst, 42

2319.99

Mountain-200 Fekete, 38

2319.99

Mountain-200 Fekete, 42

2319.99