SQL Case语句不返回任何值

时间:2015-02-26 21:03:38

标签: sql

所以我一直在尝试让它工作,当我阅读它时,它看起来非常简单和简单,但由于某种原因它不想处理简单的查询。我有一个相同的CASE语句处理具有多个表的不同报表,但是这个表不希望仅使用3个表。有一双新鲜眼睛的人可以看到我哪里出错吗?这几乎就像是在过滤结果而不是比较列。

SELECT dbo.Samples.BatchCode, dbo.SampRunTest.RunTstCode, 
       dbo.SampRunTest.RunCode, SampRunTest_1.RunTstCode AS ISO
FROM   dbo.SampRunTest 
       INNER JOIN dbo.Samples 
            ON dbo.SampRunTest.RunSmpCode = dbo.Samples.SampleCode 
       INNER JOIN dbo.SampRunTest AS SampRunTest_1 
            ON dbo.SampRunTest.RunCode = SampRunTest_1.RunCode 
               AND dbo.SampRunTest.RunAuditFlag = SampRunTest_1.RunAuditFlag
WHERE     (dbo.Samples.AuditFlag = 0) 
          AND (
              dbo.SampRunTest.RunCode = CASE 
                                           WHEN (dbo.sampruntest.runtstcode) LIKE 'U%' 
                                        THEN 'U' 
                                        ELSE (sampruntest.runtstcode) 
                                        END
               )

EDIT ---------------- 让我再试一次。所以我要做的是使用CASE语句根据查询中的另一列过滤我的列。例如,我有3个表我正在查询.... SamprunTest ...样本......和Sampleresults。 Sampleresults是我用来返回数据但需要在SamprunTest上过滤结果的主表。下面是我根据查询尝试从表中接收的数据示例。现在,上面列出的case语句不会返回任何内容。

Batchcode RunCode SampleCode RunTstCode ID Confidence 2014-236 14-13-15 C8787 AmTest NA 2014-236 14-13-15 C8787 PuTest NA 2014-236 14-13-15 C8787 GammaTest 0.9872

我知道这是一个粗略的陈述,但我很难解释事情。基本上我要做的是使用CASE语句(或其他一些方法)来过滤RunTstCode列上的ID Confidence列名。可能有助于提及“ID CONFIDENCE”列可以包含多个名称和值。这张表设置得非常奇怪。在这个例子中,我试图过滤“ID Confidence”表,当测试代码就像是gamma时,只筛选出名为“ID Confidence”的组件。

明文:

If runtstcode like 'Gamma%' then ID Confidence = 'ISO 1 ID Confidence' ELSE "NA"

1 个答案:

答案 0 :(得分:2)

在不知道您的架构或数据的情况下,这是一种调试查询的通用方法。

首先,在没有WHERE子句的情况下首先运行查询。看看数据回来了。试试这个:

SELECT     dbo.Samples.BatchCode, dbo.SampRunTest.RunTstCode, dbo.SampRunTest.RunCode, SampRunTest_1.RunTstCode AS ISO
FROM         dbo.SampRunTest INNER JOIN
                  dbo.Samples ON dbo.SampRunTest.RunSmpCode = dbo.Samples.SampleCode INNER JOIN
                  dbo.SampRunTest AS SampRunTest_1 ON dbo.SampRunTest.RunCode = SampRunTest_1.RunCode AND 
                  dbo.SampRunTest.RunAuditFlag = SampRunTest_1.RunAuditFlag

如果您没有获得任何数据,那么问题出在您的加入地点。开始删除联接并将其更改为SELECT *以查看您获得的内容。

如果您确实获得了数据,请在删除CASE部分的情况下再次运行数据:

SELECT     dbo.Samples.BatchCode, dbo.SampRunTest.RunTstCode, dbo.SampRunTest.RunCode, SampRunTest_1.RunTstCode AS ISO
FROM         dbo.SampRunTest INNER JOIN
                  dbo.Samples ON dbo.SampRunTest.RunSmpCode = dbo.Samples.SampleCode INNER JOIN
                  dbo.SampRunTest AS SampRunTest_1 ON dbo.SampRunTest.RunCode = SampRunTest_1.RunCode AND 
                  dbo.SampRunTest.RunAuditFlag = SampRunTest_1.RunAuditFlag
WHERE     (dbo.Samples.AuditFlag = 0)

如果可行,则问题出在CASE。查看返回的数据应该有助于理解问题。

- 编辑 -

如果CASE是问题,那么尝试将CASE语句放在您的查询中,如下所示:

SELECT     dbo.Samples.BatchCode, dbo.SampRunTest.RunTstCode, dbo.SampRunTest.RunCode, SampRunTest_1.RunTstCode AS ISO,
    CASE WHEN (dbo.sampruntest.runtstcode) LIKE 'U%'
         THEN 'U' 
         ELSE (sampruntest.runtstcode) 
    END AS [RunCodeShouldEqualThis],
    CASE WHEN dbo.SampRunTest.RunCode =
        CASE WHEN (dbo.sampruntest.runtstcode) LIKE 'U%' 
             THEN 'U' 
             ELSE (sampruntest.runtstcode) 
        END
        THEN 'Equals'
        ELSE 'Not Equals'
    END AS [WhereClauseCaseStatementResult]
FROM         dbo.SampRunTest INNER JOIN
                  dbo.Samples ON dbo.SampRunTest.RunSmpCode = dbo.Samples.SampleCode INNER JOIN
                  dbo.SampRunTest AS SampRunTest_1 ON dbo.SampRunTest.RunCode = SampRunTest_1.RunCode AND 
                  dbo.SampRunTest.RunAuditFlag = SampRunTest_1.RunAuditFlag