【问题标题】:Sql using where condition with case and LikeSql 使用 where 条件与 case 和 Like
【发布时间】:2016-02-25 16:47:09
【问题描述】:

我在报告生成器中有一个多个参数说@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))) + '%' 工作但我希望它完成也传递了多个值。我希望它现在能更清楚地说明问题!

任何帮助表示赞赏..提前谢谢你

【问题讨论】:

  • 我猜你的@route 不为空时类似于'1,5,10' ??
  • @route 实际上是一个 varchar,所以类似于 'Oral'、'Injection'....@juancarlosoropeza
  • 那么你需要更好地解释你的问题,因为现在我不认为需要LIKE
  • 添加了更多说明@juancarlosoropeza
  • 那么带多个参数的字符串看起来如何?

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


【解决方案1】:

很遗憾,无法将参数列表直接传递给 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

【讨论】:

  • 这很有趣.. 不确定我是否可以像我想要的那样将它与报表生成器一起使用,但我会玩弄它。谢谢@eftpotrm
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我认为正常的方法是这样的:

    WHERE route = @route OR @route = ''
    

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

    WHERE route = @route OR @route IS NULL
    

    【讨论】:

    • 问题是路由可能有 20 个字符串值,而用户只能选择 3 或 5 或 10 .... 所以当您使用多个或与 .... 那么你会怎么做确保已经涵盖了所有内容?
    • @inquisitiveSQL 。 . .你也不能使用IN,除非你使用动态SQL。
    猜你喜欢
    • 2012-01-07
    • 2014-12-17
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2014-06-24
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多