حيث باطل ، ليست فارغة أو لا يوجد فيها شرط اعتمادا على SQL Server قيمة المعلمة
-
03-07-2019 - |
سؤال
يجب إجراء مخزن في SQL Server 2000 الذي يقوم بإجراء بحث على أساس قيم المعلمات.إحدى المعلمات التي تم تمريرها في أحتاج مختلفة WHERE
شرط اعتمادا على قيمتها - المشكلة هي أن القيم 3 سيكون فيها MyColumn
IS NULL
IS NOT NULL
ANY VALUE (NULL AND NOT NULL)
(أساسا لاWHERE
شرط)
لدي بعض كتلة العقلية في الخروج مع بناء الجملة الصحيح.هل هذا ممكن أن تفعل في واحد select دون أداء بعض IF @parameter BEGIN ... END
المتفرعة?
المحلول
هنا هو كيف يمكنك حل هذه باستخدام واحد WHERE
شرط:
WHERE (@myParm = value1 AND MyColumn IS NULL)
OR (@myParm = value2 AND MyColumn IS NOT NULL)
OR (@myParm = value3)
ساذج استخدام بيان حالة لا يعمل, ، هذا يعني ما يلي:
SELECT Field1, Field2 FROM MyTable
WHERE CASE @myParam
WHEN value1 THEN MyColumn IS NULL
WHEN value2 THEN MyColumn IS NOT NULL
WHEN value3 THEN TRUE
END
فمن الممكن حل هذا باستخدام حال البيان ، انظر onedaywhen هو الجواب
نصائح أخرى
يمكنك فقط أن تفعل شيئا من هذا القبيل:
SELECT *
FROM foo
WHERE (@param = 0 AND MyColumn IS NULL)
OR (@param = 1 AND MyColumn IS NOT NULL)
OR (@param = 2)
شيء من هذا القبيل.
هذا هو كيف يمكن أن يتم ذلك باستخدام CASE
:
DECLARE @myParam INT;
SET @myParam = 1;
SELECT *
FROM MyTable
WHERE 'T' = CASE @myParam
WHEN 1 THEN
CASE WHEN MyColumn IS NULL THEN 'T' END
WHEN 2 THEN
CASE WHEN MyColumn IS NOT NULL THEN 'T' END
WHEN 3 THEN 'T' END;
WHERE MyColumn = COALESCE(@value,MyColumn)
إذا
@value
هوNULL
, ، مقارنةMyColumn
إلى نفسها ، وتجاهل@value = no where
البند.إذا
@value
قيمة (NOT NULL
) سوف مقارنةMyColumn
إلى@value
.
المرجع: تتجمع (Transact-SQL).
وسيلة أخرى الحالة:
SELECT *
FROM MyTable
WHERE 1 = CASE WHEN @myParm = value1 AND MyColumn IS NULL THEN 1
WHEN @myParm = value2 AND MyColumn IS NOT NULL THEN 1
WHEN @myParm = value3 THEN 1
END
لقد كان النجاح مع هذا الحل.انها تقريبا مثل باتريك ، مع تطور قليلا.يمكنك استخدام هذه التعبيرات بشكل منفصل.إذا كانت المعلمة فارغة ، فإنه سيتم تجاهل كل القيم عمود البحث الخاصة بك سيتم عرضها ، بما في ذلك بالقيم الخالية.
SELECT * FROM MyTable
WHERE
--check to see if @param1 exists, if @param1 is blank, return all
--records excluding filters below
(Col1 LIKE '%' + @param1 + '%' OR @param1 = '')
AND
--where you want to search multiple columns using the same parameter
--enclose the first 'OR' expression in braces and enclose the entire
--expression
((Col2 LIKE '%' + @searchString + '%' OR Col3 LIKE '%' + @searchString + '%') OR @searchString = '')
AND
--if your search requires a date you could do the following
(Cast(DateCol AS DATE) BETWEEN CAST(@dateParam AS Date) AND CAST(GETDATE() AS DATE) OR @dateParam = '')