所以也许有人可以指出我导致这个错误的正确方向?我已经和它斗争了几个小时并在网上搜索,我无法弄清楚我在这里做错了什么。它作为存储过程的一部分包含在内,我不知道是否重要,如果确实如此,我也可以包含它。表和字段名称已更改,以保护无辜...意味着我的工作。感谢。
SELECT
/* The fields are here*/
FROM
/* my joins are here */
WHERE
(Table.Field = stuff)
AND
(Table.Field2 = otherstuff)
AND
(Table2.Field3 = someotherstuff)
AND
CASE @param1
WHEN 0 THEN 'Table.Field IS NULL'
WHEN 1 THEN 'Table.Field2 IS NOT NULL'
ELSE ''
END
感谢您的回复。从技术上讲,egrunin是这个问题的正确答案,但OMG Ponies和Mark Byers几乎完全相同,只是错过了最后一件。再次感谢。
答案 0 :(得分:6)
我很确定其他答案会遗漏一个案例:
WHERE
(Table.Field = stuff)
AND
(Table.Field2 = otherstuff)
AND
(Table2.Field3 = someotherstuff)
AND
(
(@param1 = 0 and Table.Field IS NULL)
OR
(@param1 = 1 and NOT Table.Field2 IS NULL)
OR
(@param1 <> 0 AND @param1 <> 1) -- isn't this needed?
)
答案 1 :(得分:2)
您正在从case表达式返回一个字符串,但只能使用布尔值。不评估字符串。你可以使用动态SQL做你想做的事情,或者你可以这样写它:
AND (
(@param1 = 0 AND Table.Field IS NULL) OR
(@param1 = 1 AND Table.Field IS NOT NULL)
)
答案 2 :(得分:2)
使用:
WHERE Table.Field = stuff
AND Table.Field2 = otherstuff
AND Table2.Field3 = someotherstuff
AND ( (@param1 = 0 AND table.field IS NULL)
OR (@param1 = 1 AND table.field2 IS NOT NULL))
...如果您已经拥有Table.Field = stuff
等等,这没有意义......
表现更好的选项是使整个查询成为动态SQL,或者如果只有一个参数 - 使用带有单独查询的IF / ELSE语句&amp;正确的WHERE子句。