กรองข้อมูลด้วยเพรดิเคต

เสร็จสมบูรณ์เมื่อ

คําสั่ง SELECT ที่ง่ายที่สุดที่มีเฉพาะส่วนคําสั่ง SELECT และ FROM เท่านั้นที่จะประเมินทุกแถวในตาราง เมื่อใช้คําสั่งย่อย WHERE คุณสามารถกําหนดเงื่อนไขที่กําหนดแถวที่จะประมวลผลและอาจลดชุดผลลัพธ์

โครงสร้างของส่วนคําสั่ง WHERE

คําสั่งย่อย WHERE ประกอบด้วยเงื่อนไขการค้นหาอย่างน้อยหนึ่งเงื่อนไข ซึ่งแต่ละเงื่อนไขจะต้องประเมินเป็น TRUE, FALSE หรือ 'ไม่รู้จัก' สําหรับแต่ละแถวของตาราง แถวจะถูกส่งกลับเมื่อส่วนคําสั่ง WHERE ประเมินเป็น TRUE เท่านั้น เงื่อนไขแต่ละรายการทําหน้าที่เป็นตัวกรองบนข้อมูลและเรียกว่า 'เพรดิเคต' เพรดิเคตแต่ละเพรดิเคตประกอบด้วยเงื่อนไขที่กําลังทดสอบ โดยปกติแล้วจะใช้ตัวดําเนินการเปรียบเทียบพื้นฐาน:

  • = (เท่ากับ)
  • <> (ไม่เท่ากับ)
  • > (มากกว่า)
  • >= (มากกว่าหรือเท่ากับ)
  • < (น้อยกว่า)
  • <= (น้อยกว่าหรือเท่ากับ)

ตัวอย่างเช่น คิวรีต่อไปนี้จะแสดงผลิตภัณฑ์ทั้งหมดที่มีค่า ProductCategoryID เท่ากับ 2:

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

ในทํานองเดียวกัน คิวรีต่อไปนี้จะแสดงผลิตภัณฑ์ทั้งหมดที่มี ListPrice น้อยกว่า 10.00:

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

เป็น NULL / ไม่ใช่ NULL

คุณยังสามารถกรองเพื่ออนุญาตหรือแยกค่า 'ไม่รู้จัก' หรือค่า NULL โดยใช้ IS NULL หรือ IS NOT NULL ได้อย่างง่ายดาย

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

หลายเงื่อนไข

เพรดิเคตหลายรายการสามารถรวมกับตัวดําเนินการ AND และ OR และด้วยวงเล็บได้ อย่างไรก็ตาม SQL Server จะประมวลผลเงื่อนไขสองเงื่อนไขเท่านั้นในแต่ละครั้ง เงื่อนไขทั้งหมดต้องเป็น TRUE เมื่อเชื่อมต่อหลายเงื่อนไขกับตัวดําเนินการ AND เมื่อใช้ตัวดําเนินการ OR เพื่อเชื่อมต่อเงื่อนไขสองเงื่อนไข หนึ่งหรือทั้งสองอาจจะเป็น TRUE สําหรับชุดผลลัพธ์

ตัวอย่างเช่น คิวรีต่อไปนี้จะส่งกลับผลิตภัณฑ์ในประเภท 2 ที่ต้นทุนน้อยกว่า 10.00:

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

ตัวดําเนินการ AND จะถูกประมวลผลก่อนตัวดําเนินการ OR เว้นแต่ว่าจะใช้วงเล็บ สําหรับแนวทางปฏิบัติที่ดีที่สุด ให้ใช้วงเล็บเมื่อใช้เพรดิเคตมากกว่าสองรายการ คิวรีต่อไปนี้จะส่งกลับผลิตภัณฑ์ในประเภท 2 หรือ 3 และ ค่าใช้จ่ายน้อยกว่า 10.00:

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

ตัวดําเนินการเปรียบเทียบ

Transact-SQL รวมถึงตัวดําเนินการเปรียบเทียบที่สามารถช่วยลดความซับซ้อนของส่วนคําสั่ง WHERE

IN

ตัวดําเนินการ IN เป็นทางลัดสําหรับเงื่อนไขความเท่ากันหลายเงื่อนไขสําหรับคอลัมน์เดียวกันที่เชื่อมต่อกับ OR ไม่มีสิ่งใดผิดปกติในการใช้เงื่อนไข OR หลายรายการในคิวรี ดังในตัวอย่างต่อไปนี้:

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

อย่างไรก็ตาม การใช้ IN นั้นชัดเจนและรัดกุม และประสิทธิภาพของคิวรีจะไม่ได้รับผลกระทบ

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

ระหว่าง

BETWEEN เป็นทางลัดอื่นที่สามารถใช้ได้เมื่อกรองสําหรับขอบด้านบนและด้านล่างสําหรับค่าแทนที่จะใช้เงื่อนไขสองเงื่อนไขกับตัวดําเนินการ AND คิวรีสองรายการต่อไปนี้เทียบเท่ากัน:

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 ใช้ค่าขอบเขตแบบรวม ผลิตภัณฑ์ที่มีราคา 1.00 หรือ 10.00 จะรวมอยู่ในผลลัพธ์ BETWEEN จะมีประโยชน์เมื่อคิวรีเขตข้อมูลวันที่ ตัวอย่างเช่น คิวรีต่อไปนี้จะรวมชื่อผลิตภัณฑ์ทั้งหมดที่ปรับเปลี่ยนระหว่างวันที่ 1 มกราคม 2012 ถึงวันที่ 31 ธันวาคม 2012:

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

ชื่อผลิตภัณฑ์

วันที่ปรับเปลี่ยน

ถุงเท้าจักรยานเสือภูเขา, M

2012-01-01 00:00:00.000

กรอบภูเขา HL - เงิน, 42

2012-03-05 00:00:00.000

กรอบภูเขา HL - เงิน, 38

2012-08-29 00:00:00.000

Mountain-100 Silver, 38

2012-12-31 00:00:00.000

อย่างไรก็ตาม เนื่องจากเราไม่ได้ระบุช่วงเวลา ไม่มีผลลัพธ์ถูกส่งกลับหลังจาก 2012-12-31 00:00:00.000 เพื่อให้รวม วันที่และเวลา ให้ถูกต้อง เราจําเป็นต้องรวมเวลาไว้ในเพรดิเคต:

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

ตัวดําเนินการเปรียบเทียบพื้นฐาน เช่น Greater Than (>) และ Equals (=) ยังถูกต้องเมื่อกรองตามวันที่เท่านั้น:

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

ชอบ

ตัวดําเนินการเปรียบเทียบขั้นสุดท้ายสามารถใช้ได้เฉพาะสําหรับข้อมูลอักขระเท่านั้น และช่วยให้เราสามารถใช้อักขระตัวแทนและรูปแบบนิพจน์ปกติได้ สัญลักษณ์ตัวแทนช่วยให้เราสามารถระบุสตริงบางส่วนได้ ตัวอย่างเช่น คุณสามารถใช้คิวรีต่อไปนี้เพื่อส่งคืนผลิตภัณฑ์ทั้งหมดที่มีชื่อที่มีคําว่า "mountain":

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

อักขระ % ตัวแทนจะแสดงสตริงใด ๆ ของ 0 หรือมากกว่า ดังนั้นผลลัพธ์จะรวมผลิตภัณฑ์ที่มีคําว่า "mountain" ที่ใดก็ตามในชื่อ ดังเช่นนี้:

Name

ListPrice

ถุงเท้าจักรยานเสือภูเขา, M

9.50

ถุงเท้าจักรยานเสือภูเขา, L

9.50

กรอบภูเขา HL - เงิน, 42

1364.0

กรอบภูเขา HL - สีดํา, 42

1349.60

กรอบภูเขา HL - เงิน, 38

1364.50

Mountain-100 Silver, 38

3399.99

คุณสามารถใช้อักขระตัวแทน _ (ขีดล่าง) เพื่อแสดงอักขระเดี่ยวเช่นนี้:

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

ผลลัพธ์ต่อไปนี้รวมเฉพาะผลิตภัณฑ์ที่ขึ้นต้นด้วย "Mountain Bike Socks, " และอักขระเดียวหลังจาก:

ชื่อผลิตภัณฑ์

ListPrice

ถุงเท้าจักรยานเสือภูเขา, M

9.50

ถุงเท้าจักรยานเสือภูเขา, L

9.50

คุณยังสามารถกําหนดรูปแบบที่ซับซ้อนสําหรับสตริงที่คุณต้องการค้นหาได้ ตัวอย่างเช่น คิวรีต่อไปนี้ค้นหาผลิตภัณฑ์ที่มีชื่อที่ขึ้นต้นด้วย "Mountain-" จากนั้นจึงตามด้วย:

  • สามอักขระระหว่าง 0 ถึง 9
  • ช่องว่าง
  • สตริงใด ๆ
  • เครื่องหมายจุลภาค
  • ช่องว่าง
  • สองอักขระระหว่าง 0 ถึง 9
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';

ผลลัพธ์จากคิวรีนี้อาจมีลักษณะดังนี้:

ชื่อผลิตภัณฑ์

ListPrice

Mountain-100 Silver, 38

3399.99

Mountain-100 Silver, 42

3399.99

Mountain-100 สีดํา, 38

3399.99

Mountain-100 สีดํา, 42

3399.99

Mountain-200 Silver, 38

2319.99

Mountain-200 Silver, 42

2319.99

Mountain-200 สีดํา, 38

2319.99

Mountain-200 สีดํา, 42

2319.99