WHERE 语句中的嵌套 CASE

杰米·蒂尔玛

我正在尝试修改存储过程以使用帐户住所覆盖(如果填充而不是帐户住所)。@AccountDomicile 传递参数可以是单个值或管道分隔值,因此以下是可以传递的变体:

@AccountDomiciles = 'All'
@AccountDomiciles = 'UK'
@AccountDomiciles = '|UK|'
@AccountDomiciles = '|UK|Australia|'

下面是其他人写的,没有考虑覆盖。

WHERE
    (@AccountDomiciles  = 'All'
    OR @AccountDomiciles = [accounts].[Account Domicile]
    OR @AccountDomiciles LIKE '%|'+[accounts].[Account Domicile]+'|%')

这就是我想出的似乎有效的方法,但是有没有更好和更短的写法?

WHERE
    (@AccountDomiciles =
        CASE 
            WHEN @AccountDomiciles = 'All' THEN 'All'
            WHEN [accounts].[Account Domicile Override] <> '' AND LEN([accounts].[Account Domicile Override]) > 1
                THEN [accounts].[Account Domicile Override] 
            ELSE [accounts].[Account Domicile]
        END
    OR
    @AccountDomiciles LIKE
        CASE 
            WHEN @AccountDomiciles = 'All' THEN 'All'
            WHEN [accounts].[Account Domicile Override] <> '' AND LEN([accounts].[Account Domicile Override]) > 1
                THEN '%|'+[accounts].[Account Domicile Override]+'|%'
            ELSE '%|'+[accounts].[Account Domicile]+'|%'
        END)
戈登·利诺夫

这表明类似:

WHERE @AccountDomiciles = 'All' OR
      ([accounts].[Account Domicile Override] <> '' AND
       '|' + @AccountDomiciles + '|' LIKE '%|' + [accounts].[Account Domicile Override]  + '|%'
      ) OR
      ([accounts].[Account Domicile Override] = '' AND
       '|' + @AccountDomiciles + '|' LIKE '%|' + [accounts].[Account Domicile]  + '|%'
      ) 

如果覆盖可以是NULL而不是空字符串,您可能需要进行调整,但这会使用您问题中的逻辑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章