【问题标题】:Using LIKE within CASE in TSQL在 SQL 的 CASE 中使用 LIKE
【发布时间】:2011-12-27 01:50:42
【问题描述】:

我想选择包含@selctDescription 参数内容的记录,但前提是@selctDescription 不为空。

我有以下,但不起作用:

(t.[description] LIKE 
  (
  CASE 
  WHEN @selctDescription = '' THEN t.[description] 
  ELSE ('%' @selctDescription '%') 
  END
  )
)

谁能指出我正确的方向?

【问题讨论】:

    标签: sql tsql case sql-like


    【解决方案1】:

    给你一些想法......

    如果你有'%' @selctDescription '%',你只需要在字符串之间使用+ 来连接它们。然后,您的代码将按原样运行。

    • '%' + @selctDescription + '%'


    另外,请注意,您甚至不需要 CASE 语句,因为当参数为空时,您会得到 '%%',它仍然会匹配所有内容。


    知道这一点很有用,因为目前LIKE 语句的两侧都有表字段。这真的会伤害优化器。如果我要使用 CASE,我会更倾向于坚持...

    t.[description] LIKE (CASE WHEN @selctDescription = '' THEN '%' ELSE ('%' + @selctDescription + '%') END)
    

    这样做的好处是 CASE 语句的结果可以在执行查询之前作为标量值执行一次。而不是每行都重新计算。


    也就是说,它在功能上与...相同

    t.[description] LIKE ('%' + @selctDescription + '%')
    

    【讨论】:

    • t.[description] LIKE (CASE WHEN '@selctDescription' = '' THEN '%' ELSE ('%' + '@selctDescription' + '%') END),是否可以当我有 '=' 而不是 like 时使用这个表达式?
    • 您不想在变量名周围使用'。但除此之外,是的,您也可以将此模式用于= 操作...table.x = (CASE WHEN @variable = '' THEN 'Something Special' ELSE @variable END)
    【解决方案2】:

    根据您的第一行和 cmets,您需要进行以下选择:

    Select * from table
      where field <> ''
      and field like '%' + @selctDescription + '%'
    

    但是您必须输入正确的表格字段,并且@selctDescription 必须是文本(char、nchar、varchar、nvarchar、...)。

    【讨论】:

      【解决方案3】:

      我认为你的代码相当于:

      t.[description]  LIKE  '%' + @selctDescription + '%' 
      

      另一方面,您的描述表明您想要这个:

      @selctDescription <> ''
      AND t.[description]  LIKE  '%' + @selctDescription + '%' 
      

      【讨论】:

        【解决方案4】:
        @selctDescription = '' OR t.[description] LIKE '%' + @selctDescription + '%'
        

        【讨论】:

          【解决方案5】:
          SELECT * 
          FROM Table
          WHERE 
            ((@selctDescription IS NULL OR @selctDescription = '') 
             OR
             (t.[description] LIKE '%' + @selctDescription +'%'))
          

          【讨论】:

          • 所以删除 @selctDescription IS NULL,即使你今天没有使用 NULL,考虑这一点也很安全,我会说 IsNullOrEmpty 是这种情况的常见模式,所以我建议也保留 IS NULL 条件跨度>
          • @CiccioMiami:我们不知道 ;-) 然后删除那部分
          猜你喜欢
          • 2011-10-08
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-24
          • 1970-01-01
          • 2020-01-17
          • 2017-08-15
          相关资源
          最近更新 更多