2011-06-24 81 views
1

我正在使用隐藏的内部参数(@DoorHelper)来检查我使用的另一个参数(@Door)是否包含一个特殊值,我用它来表示'global '('9999'),并返回所有门。SSRS2008 - SELECT CASE ... WHEN ... THEN

SELECT 
CASE 
WHEN ('9999'+'-'+ RIGHT(Unknown1,1) in (@Door)) 
THEN (SELECT DISTINCT [Zone]+' - '+CAST([OfficeID] as char(5)) FROM [ADB].[dbo].[ZoneByOffice]) 
ELSE (@Door) 
END AS ZoneID 
FROM [ADB].[dbo].[EventLog] 

问题是,从THEN返回多于1个结果似乎会引发错误。

我该如何改革这个SQL来做我想做的事?

+0

'@ Door'看起来像什么?它是否是一个CSV列表,您试图将其用作“IN(...)'运算符的实际值列表? –

回答

1

您可以使用TOP 1

SELECT 
    CASE 
     WHEN ('9999'+'-'+ RIGHT(Unknown1,1) in (@Door)) 
     THEN (SELECT TOP 1 [Zone]+ ' - '+ CAST([OfficeID] as char(5)) FROM [ADB].[dbo].[ZoneByOffice]) 
     ELSE (@Door) 
    END AS ZoneID 
FROM [ADB].[dbo].[EventLog] 

,或者你限制结果通过独特场WHERE条件设置如果有的话,要保证它永远不会返回不止一行。

+0

我可以使用Distinct和您的建议吗?从我的理解,如果我使用TOP1那样,我可能会得到很多相同的[Zone]而不是所有可用的集合? – CodeMinion

+0

'TOP 1'只返回一个,所以'DISTINCT'在这种情况下没有多大意义。 –

+0

@Kitler - 如果这不是您想要的,请为查询显示样本输入和预期输出。 –