WHERE 语句中的嵌套 CASE
Nested CASE within WHERE Statement
我正在尝试修改存储过程以使用帐户住所覆盖(如果已填充)而不是帐户住所。 @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
而不是空字符串,您可能需要进行调整,但这会使用您问题中的逻辑。
我正在尝试修改存储过程以使用帐户住所覆盖(如果已填充)而不是帐户住所。 @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
而不是空字符串,您可能需要进行调整,但这会使用您问题中的逻辑。