SQL列中有两个可能的结果集,WHERE子句中的用例选择一个

时间:2015-05-01 18:22:11

标签: sql-server sql-server-2008

我有一种情况需要创建一个查询,其中我的查询的过滤器需要2个可能位置中的1个的结果集。

我开始在线搜索,看看是否有办法使用这样的CASE语句:

A.Column IN (CASE EXISTS()...THEN (SELECT...)... END)

并且找不到任何确定的答案,所以我尝试自己制作这样的东西,但是我得到以下错误,我不明白为什么:

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

简单来说,我希望我的查询要做的只是根据报告类型过滤掉包裹中包含合同的包裹,其中包含名为Contracts的驱动程序表。有些报告在驱动程序表中有很多合同,有些报告没有。如果报表类型在驱动程序表中没有合同,请使用所有可能的合同。我的约束是不使用动态SQL,因此可以将此查询放入表值函数

我的查询如下:

SELECT DISTINCT 
    IDNum, PName, County, CountyDescription,
    DATENAME(MONTH, ptn) AS ptn_mt_char,
    YEAR(ptn) AS ptn_yr,
    MONTH(ptn) AS ptn_mt,
    ptn
FROM
    (SELECT 
         A.ID AS IDNum, 
         A.PName, A.County, A.CountyDescpription,
         dbo.udf_getPtn(A.ID, 
                        CAST(@ReportType AS VARCHAR), 
                        CAST(@DataDate AS VARCHAR), 
                        CAST(@montha AS VARCHAR), 
                        CAST(@monthb AS VARCHAR), 
                        CAST(@total_fa AS VARCHAR), 
                        CAST(@total_fb AS VARCHAR)) AS ptn
     FROM 
         DB.dbo.PData A
     LEFT JOIN 
         DB.dbo.FData B ON A.ID = B.ID
     WHERE 
         A.Contract IN (CASE WHEN EXISTS(SELECT cnt FROM dbo.Contracts WHERE ReportType = @ReportType AND SubReportType = @SubReportType)
                             THEN (SELECT cnt FROM dbo.Contracts WHERE ReportType = @ReportType AND SubReportType = @SubReportType)
                             ELSE (SELECT DISTINCT ConC FROM DB.dbo.PData)   
                        END)) A 
WHERE 
    ptn IS NOT NULL 
ORDER BY 
    ptn, IDNum

2 个答案:

答案 0 :(得分:1)

CASE表达式无法返回多个值,因此您无法按照您的想法将其与IN结合使用。您可以像这样重写WHERE子句:

WHERE (         
       A.Contract IN (SELECT cnt 
                      FROM dbo.Contracts 
                      WHERE ReportType = @ReportType AND 
                            SubReportType = @SubReportType)
     )
     OR
     (
      NOT EXISTS (SELECT 1
                  FROM dbo.Contracts 
                  WHERE ReportType = @ReportType AND 
                        SubReportType = @SubReportType)
      AND         
      A.Contract IN (SELECT DISTINCT ConC FROM DB.dbo.PData)
     )

答案 1 :(得分:0)

我建议你创建两个视图来规范化两个表之间的列选择(并使用查询分析器独立地优化它们),然后在你的sproc中加入它们并过滤新的“组合”列。