2011-07-27 38 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