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而不是空字符串,您可能需要进行调整,但这使用了问题中的逻辑。

相关内容

  • 没有找到相关文章

最新更新