我甚至不會用CASE
聲明...
WHERE
(@EmployeeType = 'All')
OR (@EmployeeType = 'Internal' AND EmploymentType = 'Internal')
OR (@EmployeeType = 'External' AND EmploymentType IN ('External', 'Outsource', 'Contract'))
編輯:
這就是說,無論你如何實現這一點,你可能不會得到很好的執行計劃。這是深入的,但推理是在這裏:http://www.sommarskog.se/dyn-search.html
TL;DR
- 這將是更高性能使用Multiple different queries inside IF blocks
或Dynamic SQL
。
編輯:
如果你想用一個CASE
語句來做到這一點,或者它是一個學術活動中如何型的東西應措辭......
在SQL服務器,CASE
語句只能返回一個標量值。它不能返回一個列表,甚至不能返回布爾結果。這迫使你使用嵌套條件。
WHERE
CASE @EmployeeType
WHEN 'All'
THEN 1
WHEN 'Internal'
THEN CASE WHEN EmploymentType = 'Internal' THEN 1 END
WHEN 'External'
THEN CASE WHEN EmploymentType IN ('External', 'Outsource', 'Contract') THEN 1 END
END
=
1
這不是很漂亮。
另一種選擇是使用可以返回一組值來比較的子查詢。
WHERE
EmploymentType IN (
(
SELECT 'Internal' AS type WHERE @EmployeeType IN ('All', 'Internal')
UNION ALL
SELECT 'External' AS type WHERE @EmployeeType IN ('All', 'External')
UNION ALL
SELECT 'Contract' AS type WHERE @EmployeeType IN ('All', 'External')
UNION ALL
SELECT 'Outsource' AS type WHERE @EmployeeType IN ('All', 'External')
)
)
你覺得我在這裏失去了一些東西?如果它是「全部」,那很簡單。如果它是'External',則需要任何「Contract」或「Outsource」。但是,如果它是「內部」,你想申請什麼? – MatBailie
如果它的'內部'我想內部本身。 –