Sql使用where case with case和Like

时间:2016-02-25 16:47:09

标签: sql sql-server-2008 reportbuilder3.0

我在报表生成器中有一个多参数说@route。我需要@route才能传递空白('')当发生这种情况时,所有内容都显示在结果上,这将是我的参数@route的默认值。 (由完成         路线LIKE'%' +(LTRIM(RTRIM(@route)))+'%')

基本上做这样的事情:

SELECT * 
FROM @finalTable ft 
WHERE CASE WHEN @route = '' THEN route LIKE '%' + (LTRIM(RTRIM(@route))) + '%'
           ELSE  route IN (@route)
      END

为了使事情更清楚:

@route是一个字符串,并且说有200个不同的值。我基本上想要设置一个默认值' ' (空白或空)并允许说10个不同的值供用户选择。所以基本上如果用户没有选择任何东西('因为默认值为空或可以为空),那么他/她仍然获得整个结果集。因此,如果我限制用户只传递单个值和' '作为其中之一然后@route LIKE'%' +(LTRIM(RTRIM(@route)))+'%'但是我希望它能够通过传递多个值来完成。我希望现在能更清楚地澄清事情!!

感谢任何帮助..提前谢谢

3 个答案:

答案 0 :(得分:0)

我认为正常的方法有点像:

WHERE route = @route OR @route = ''

通常NULL用于此目的而不是空字符串:

WHERE route = @route OR @route IS NULL

答案 1 :(得分:0)

不幸的是,无法将参数列表直接传递给IN语句。

如果你想这样做,我建议最简单的方法是发送一个包含你的ID列表的表值参数。这样你可以加入它以获得与你所建议的IN查询相同的效果。

这不会直接允许你做条件WHERE子句,但你可以做的是检查表值参数是否包含任何行并相应地采取行动 - 可能是这样的:

DECLARE @Routes IDList;

SELECT * 
FROM @finalTable ft 
        LEFT JOIN @Routes r
            ON ft.Route=r.Route
        CROSS JOIN (SELECT COUNT(*) AS Recs FROM @Routes) cnt
WHERE
    1= CASE WHERE cnt.Recs = 0 THEN 1 
        ELSE  CASE WHEN r.Route IS NULL THEN 0 ELSE 1 END

答案 2 :(得分:0)

如果您的@route类似于'1,5,10'

SELECT * 
FROM @finalTable ft 
WHERE ',' + @route + ',' LIKE  '%,' + ft.route + ',%'