2012-01-05 2 views
1

Запись хранимой процедуры, которая будет иметь несколько входных параметров. Параметры могут не всегда иметь значения и могут быть пустыми. Но поскольку существует вероятность, что каждый параметр может содержать значения, я должен включить критерий, который использует эти параметры в запросе.Sql Server IN Пункт №

Мой запрос выглядит так:

SELECT DISTINCT COUNT(*) AS SRM 
FROM table p 
WHERE p.gender IN (SELECT * FROM Fn_SplitParms(@gender)) AND 
p.ethnicity IN (SELECT * FROM Fn_SplitParms(@race)) AND 
p.marital_status IN (SELECT * FROM Fn_SplitParms(@maritalstatus)) 

Так что моя проблема в том, если @gender пуст (»«) запрос будет возвращать данные, где пол поле пустым, когда я действительно хочу, чтобы просто игнорировать р. пола все вместе. Я не хочу выполнять эту задачу с использованием условных операторов IF/ELSE, потому что их было бы слишком много.

Есть ли способ использовать CASE с IN для этого сценария? OR Есть ли другая логика, что я просто не понимаю, что это решит?

Возникли проблемы с поиском что-то, что хорошо работает ...

Спасибо!

+1

Примечание: построение единого запроса для выполнения этого часто дает ужасные планы выполнения. Следующая статья очень глубока, но подчеркивает, что DynamicSQL дает самый эффективный динамический поиск. http://www.sommarskog.se/dyn-search.html – MatBailie

ответ

2

Использование or:

SELECT DISTINCT COUNT(*) AS SRM 
FROM table p 
WHERE 
(p.gender IN (SELECT * FROM Fn_SplitParms(@gender)) OR @gender = '') 
AND (p.ethnicity IN (SELECT * FROM Fn_SplitParms(@race)) OR @race = '') 
AND (p.marital_status IN (SELECT * FROM Fn_SplitParms(@maritalstatus)) OR @maritalstatus = '') 
+0

Ahh гораздо проще, чем я делал это ... Спасибо! – Encryption

0

Вы могли бы также рассмотреть вопрос о табличных значениях параметров (if using SQL Server 2008 and up) - это иногда может сделать код более простым, так как они рассматриваются как таблицы (в вашем случае, может быть пустой), и вы можете присоединиться - плюс не требуется функция неудобного разделения.