2011-07-27 1 views
2

J'essaie de renvoyer plusieurs valeurs dans une seule colonne qui sont liées à un numéro de position (1 à 6), mais uniquement les valeurs qui ont une certaine position dans chaque cas. Fondamentalement, j'ai 6 colonnes que je veux créer, 1 pour chaque position, et retourne toutes les valeurs de résultat associées à ce numéro de position. J'ai créé 6 déclarations de cas pour tenter Nested d'obtenir ces résultats:Renvoyer plusieurs valeurs de SELECT imbriquées dans 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, 

Le problème est qu'ils ne renvoient que des valeurs NULL dans la façon dont il est mis en place. Si je supprime le cas, la sous-requête Message d'erreur a renvoyé plus de 1. Cela n'est pas autorisé lorsque la sous-requête suit =,! =, <, < =,>,> = ou lorsque la sous-requête est utilisée comme expression."

EDIT: Le code complet est partie en vue donc je l'ai simplifié à ce qui est pertinent

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

peut être utile de noter précisément ce que variante de SQL (T-SQL, MySQL, PL/SQL) que vous utilisez, depuis le ISNULL/IFNULL les fonctions varient entre eux. –

Répondre

1

Une instruction CASE ne peut pas être utilisé pour faire 6 lignes à apparaître à la place d'une ligne. Vous devez construire votre logique "1 ou plusieurs lignes" dans les JOINs de votre requête, pas l'instruction CASE.

Incluez votre requête complète et votre schéma, ainsi qu'une explication de ce que vous essayez d'accomplir.

+0

Modifié pour afficher le reste du code, au besoin. Ce que j'essaie d'accomplir, c'est d'avoir 6 colonnes dans la vue, une pour chacune des six positions de puits, avec son résultat de puits associé. Le numéro de position du puits et le résultat sont tous deux trouvés dans Tbl_TestWell. Dans la colonne Well_1_Graded_Results par exemple, je veux récupérer tous les résultats avec un Well_index de 1 à partir de la table TestWell. Est-ce plus clair? – Jon

0

Vous ne pouvez pas utiliser d'opérateurs logiques lors de la vérification des valeurs NULL. NULL représente inconnu, donc 1 = NULL? Non. 1 <> NULL? Non, car NULL pourrait être 1 dans ce cas - nous ne savons pas, c'est inconnu. Au lieu de cela, vous devez utiliser IS NULL et IS NOT NULL pour effectuer des vérifications NULL et des comparaisons.

Ainsi, il ressemblerait à ceci:

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

0

Je suppose que vous avez plusieurs (6) avec des lignes tbl_TestWells.Well_Index = 1, 2, 3... et que vous voulez recueillir ces résultats dans une ligne?

Si oui, vous avez besoin de quelque chose comme:

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 
Questions connexes