Возврат нескольких значений из SELECT, вложенных в CASE - PullRequest
2 голосов
/ 27 июля 2011

Я пытаюсь вернуть несколько значений в одном столбце, которые связаны с номером позиции (от 1 до 6), но только те значения, которые имеют определенную позицию в каждом случае.В основном у меня есть 6 столбцов, которые я хочу создать, по 1 для каждой позиции, и вернуть все значения результата, связанные с этим номером позиции.Я создал 6 операторов Nested 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 в том виде, в котором он настроен.Если я исключаю случай, то получаю подзапрос «Сообщение об ошибке», возвращающий более 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

; 

Ответы [ 3 ]

1 голос
/ 27 июля 2011

Оператор CASE нельзя использовать, чтобы вместо одной строки отображалось 6 строк.Вам необходимо встроить свою логику «1 или много строк» ​​в СОЕДИНЕНИЯ вашего запроса, а не в оператор CASE.

Включите полный запрос и схему, а также объяснение того, чего вы пытаетесь достичь.

0 голосов
/ 27 июля 2011

Я думаю, что у вас есть несколько (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
0 голосов
/ 27 июля 2011

Нельзя использовать логические операторы при проверке значений NULL. NULL представляет неизвестное, поэтому 1 = NULL? Нет. 1 <> NULL? Нет, потому что NULL может быть 1 в этом случае - мы не знаем, его неизвестно.

Вместо этого вам нужно использовать IS NULL и IS NOT NULL для выполнения NULL-проверок и сравнений.

Итак, это будет выглядеть так:

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

...