1
我的要求:如果'名字'和'地址'不为空,那么就要考虑两者的价值。如果其中一个是空的,但是其他的只是给定的,那就只是“搜索”给定的。当我在where子句中出现什么情况?
SELECT * from myTable where (1=1) AND (@p_ID is null or [Id] = @p_ID)
AND
case
when [Name] IN (SELECT keyValue FROM @p_PersonalData)
then
((SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0
OR ([Address] IN (SELECT dictKey FROM @p_PersonalData))
AND ([Name] IN (SELECT keyValue FROM p_PersonalData)))
else
((SELECT COUNT(*) AS lines FROM @p_PersonalData) = 0
OR ([Address] IN (SELECT dictKey FROM p_PersonalData))
ORDER BY [...]
info:它完美无缺地工作。选择语句和和/或是非常好的
问题是,sql服务器管理工作室红色突出显示等号'= 0',并表示他期望AND或THEN,但是有一个'然后'...
编辑你的问题,并提供样本数据和所需的结果。另外,使用您正在使用的数据库标记。 –
'CASE WHEN'不属于'WHERE'子句。没有必要在那里构造条件,因为子句已经*是一个条件,您可以将子表达式与“AND”,“OR”和括号组合在一起。除此之外,我不知道你在做什么:-)按照戈登的建议,并显示样本数据和预期结果。 (是的,只要有SQL问题,就给DBMS添加标签。) –
T-SQL没有“布尔表达式”作为第一级公民 - 你不能使用布尔表达式作为结果,并且没有(显式的) 'TRUE'或'FALSE'。因此,无论对我们有多大的意义,“CASE WHEN ... Then END”都不合法。将其重写为'AND(([Name] IN ... AND ...)或NOT([Name] IN)... AND ...)'形式的东西。 –