2011-07-27 39 views
2

我试图在链接到位置编号(1到6)的单个列中返回多个值,但只是在每种情况下都具有特定位置的那些值。基本上我有6个我想创建的列,每个位置1个,并返回与该位置编号关联的所有结果值。我创建了6个巢式病例报告,试图获得这些结果:从SELECT中返回嵌套在CASE中的多个值

(CASE WHEN tbl_TestWells.well_result <> NULL 
THEN 
(SELECT tbl_TestWells.well_result 
FROM tbl_TestWells 
WHERE tbl_TestWells.Well_Index = 1) 
ELSE NULL END) AS Well_1_Graded_Result, 

的问题是,他们只在它的设置方式返回NULL值。如果我把这个情况拿出来,那么我得到错误消息“subquery返回的值超过1,当子查询跟随=,!=,<,< =,>,> =或者子查询用作表达。”

编辑:完整的代码部分的图,所以我已经将其简化成什么相关

SELECT DISTINCT 
--Other Columns being selected 

(CASE WHEN tbl_TestWells.well_result <> NULL 
THEN 
(SELECT tbl_TestWells.well_result 
FROM tbl_TestWells 
WHERE tbl_TestWells.Well_Index = 1) 
ELSE NULL END) AS Well_1_Graded_Result, 

--The other five well results are set up in the exact same format as above, just replacing 1 with the corresponding number 

FROM tbl_TestCartridges 

JOIN tbl_Tests ON 
tbl_Tests.test_uid = tbl_TestCartridges.test_uid 

JOIN tbl_Programs ON 
tbl_Programs.program_uid = tbl_Tests.program_uid 

JOIN tbl_Cartridges ON 
tbl_Cartridges.system_uid = tbl_Programs.system_uid 

JOIN tbl_TestWells ON 
tbl_TestWells.test_cartridge_uid = tbl_TestCartridges.test_cartridge_uid 

JOIN tbl_TestSamples ON 
tbl_TestSamples.test_well_uid = tbl_TestWells.test_well_uid 

ORDER BY tbl_TestCartridges.barcode 

; 
+2

可能有助于特别注意什么,你正在使用SQL(T-SQL,MySQL和PL/SQL)的变种,因为ISNULL/IFNULL它们的功能各不相同。 –

回答

1

case语句不能用来使6行出现在地方一排。您需要将您的“1行或多行”逻辑构建到查询的JOIN中,而不是CASE语句。

包括您的完整查询和模式,以及您想要实现的内容的解释。

+0

根据需要编辑以显示其余代码。我想要完成的是在视图中获得6列,对于6个井位中的每一个都有一列,并且它的结果很好。井位号和结果都在Tbl_TestWell中找到。例如,在Well_1_Graded_Results列中,我想从TestWell表中检索Well_index为1的所有结果。这更清楚吗? – Jon

0

检查NULL值时,不能使用逻辑运算符。 NULL表示未知,所以1 = NULL?否是1 <> NULL?不,因为NULL 可能在这种情况下是1 - 我们不知道,它的未知。

取而代之,您需要使用IS NULLIS NOT NULL进行NULL检查和比较。

因此,它应该是这样的:

(CASE WHEN tbl_TestWells.well_result IS NOT NULL THEN ...

0

我想,你有几个(6)行与tbl_TestWells.Well_Index = 1, 2, 3...,你想在一行中收集这些结果?

如果是的话,你需要的东西,如:

SELECT 
    MIN(CASE WHEN tbl_TestWells.well_result IS NOT NULL 
        AND tbl_TestWells.Well_Index = 1 
       THEN tbl_TestWells.well_result 
     END 
     ) AS Well_1_Graded_Result 
    , MIN(CASE WHEN tbl_TestWells.well_result IS NOT NULL 
        AND tbl_TestWells.Well_Index = 2 
       THEN tbl_TestWells.well_result 
     END 
     ) AS Well_2_Graded_Result 
    , ... 
FROM 
    ... 
GROUP BY 
     ?       --- what do these (6) rows have in common? 
ORDER BY 
     tbl_TestCartridges.barcode