sql - CASE 表达式中的 MSSQL 子选择

标签 sql sql-server reporting-services

我在这里有点挣扎。

我有一个查询要根据参数返回一些值。参数按预期工作。它们由 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/

相关文章:

mysql - "Repeatable read"与乐观

sql - PostgreSQL 查询中每个月的最后三个月平均值

self JOIN 的 SQL 性能

sql - 重构——两条可怕的线

sql - 如何检查表上持有哪些锁

reporting-services - SSRS - 更改 "View Report"按钮的位置

mysql - 查询优化 - 第二意见

.net - 持续传输来自合作伙伴的数据

asp.net - 报告服务 2012 - ReportViewer

reporting-services - 如何在新窗口中添加子报表?