我在这里有点挣扎。
我有一个查询要根据参数返回一些值。参数按预期工作。它们由 MS SQL Reporting Services 提供。
这按预期工作:
SELECT
T0.CardName
FROM OCRD T0
WHERE
T0.[CardCode] IN (SELECT cardcode from USK_Codes_CR) -- <-- MSSQL View
ORDER BY
T0.[CardName]
所以我想,也许尝试这样的事情:
SELECT
T0.CardName
FROM OCRD T0
WHERE
T0.[CardCode] IN (
CASE
WHEN @VB = 'CR' THEN (SELECT cardcode from USK_Codes_CR)
WHEN @VB = 'GR' THEN (SELECT cardcode from USK_Codes_GR)
WHEN @VB = 'ZV' THEN (SELECT cardcode from USK_Codes_ZV)
END)
ORDER BY
T0.[Cardname]
我试图提供命名参数,如“CR”、“ZV”、“GR”等。但在后台,表达式应该返回一个值列表。因此...Carcode IN (...) 语句。
我已经知道 SSRS 级别的解决方法,例如提供带有复选框的值列表等。但我希望用户只需选择其中一个命名参数,这样他们就不必为数百个结果而烦恼。
有什么想法吗?
编辑: 我选择this answer最适合我的需求,因为它对我可以做得更好的方面有简洁的解释和建议。
WHERE (@VB = 'CR' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_CR) ) OR
(@VB = 'GR' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_GR) ) OR
(@VB = 'ZV' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_ZV) )
最佳答案
SQL Server 不支持 bool 类型或 bool 表达式作为单个值。相反,使用基本的 bool 逻辑:
WHERE (@VB = 'CR' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_CR) ) OR
(@VB = 'GR' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_GR) ) OR
(@VB = 'ZV' AND T0.[CardCode] IN (SELECT cardcode from USK_Codes_ZV) )
但是,这可能不是最好的解决方案。您可能应该将所有代码存储在一个具有适当“VB”值的表中。那么逻辑就很简单:
T0.[CardCode] IN (SELECT cardcode FROM USK_Codes c WHERE c.vb = @vb)
多个表具有相同的列集通常表明数据模型存在问题。
关于sql - CASE 表达式中的 MSSQL 子选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48705741/