J'ai actuellement une instruction CASE qui vérifie si certaines tâches sont terminées ou non, puis renvoie la date de la tâche suivante. Puisque les tâches sont commandées, chaque instruction WHEN devient plus longue, vérifiant chacune des tâches précédentes pour voir si elles sont complètes. Pour une raison quelconque, après la première instruction WHEN, elle saute directement à ELSE (elle devrait répondre aux conditions de la deuxième ou troisième WHEN).SQL CASE vérifiant deux conditions de la même colonne
CASE
WHEN T.PRNAME = 'TECH PEP MEETING DATE' AND T.PRSTATUS != 2 THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'TECH PEP MEETING DATE' AND PRISMILESTONE = 1)
WHEN (T.PRNAME = 'TECH PEP MEETING DATE' AND T.PRSTATUS = 2) AND (T.PRNAME = 'BRU MEETING DATE' AND T.PRSTATUS != 2) THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'BRU MEETING DATE' AND PRISMILESTONE = 1)
WHEN (T.PRNAME = 'TECH PEP MEETING DATE' AND T.PRSTATUS = 2) AND (T.PRNAME = 'BRU MEETING DATE' AND T.PRSTATUS = 2) AND (T.PRNAME = 'TSC MEETING DATE' AND T.PRSTATUS != 2) THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'TSC MEETING DATE' AND PRISMILESTONE = 1)
ELSE (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'END OF EVALUATE PHASE' AND PRISMILESTONE = 1)
END
Existe-t-il un moyen spécifique pour répondre à ces types de conditions multiples? EDIT: Donc, après quelques commentaires de votre part, je suis d'accord avec l'idée que vous avez seulement besoin d'évaluer une tâche par WHEN parce que l'instruction CASE devrait quitter une fois qu'elle a trouvé sa première déclaration TRUE. Cependant, après avoir mis à jour à:
CASE
WHEN UPPER(T.PRNAME) = 'EVALUATE TECH PEP MEETING DATE' AND T.PRSTATUS != 2 THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'TECH PEP MEETING DATE' AND PRISMILESTONE = 1 AND ROWNUM = 1)
WHEN UPPER(T.PRNAME) = 'EVALUATE BRU MEETING DATE' AND T.PRSTATUS != 2 THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'BRU MEETING DATE' AND PRISMILESTONE = 1 AND ROWNUM = 1)
WHEN UPPER(T.PRNAME) = 'EVALUATE TSC MEETING DATE' AND T.PRSTATUS != 2 THEN (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'TSC MEETING DATE' AND PRISMILESTONE = 1 AND ROWNUM = 1)
ELSE (SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY') FROM PRTASK T WHERE T.PRPROJECTID = INV_INVESTMENTS.ID AND Upper(T.PRNAME) = 'END OF EVALUATE PHASE' AND PRISMILESTONE = 1)
END
Je reçois maintenant:
ORA-01427: single-row subquery returns more than one row
Je ne sais pas pourquoi cela est le cas, en particulier après avoir mis ROWNUM = 1
sur la fin pour assurer un seul résultat est retourné.
Lors de l'exécution THEN par lui-même:
SELECT TO_CHAR(MAX(T.PRFINISH),'DD/MM/YY')
FROM PRTASK T
WHERE T.PRPROJECTID = INV_INVESTMENTS.ID
AND Upper(T.PRNAME) = 'TECH PEP MEETING DATE'
AND PRISMILESTONE = 1
AND ROWNUM = 1
Je reçois un résultat. Si j'ai raison de penser que l'instruction CASE va sortir une fois qu'elle aura trouvé sa première déclaration TRUE, pourquoi trouve-t-on plusieurs lignes?
EDIT 2: Ok - donc j'ai joué avec ça un peu plus (parce que je n'arrive toujours pas à trouver une réponse logique et j'ai fait quelques progrès.) J'ai maintenant changé la façon dont la requête est structurée en suivant:.
SELECT DISTINCT To_Char(T.PRFINISH, 'DD/MM/YY'),
T.PRNAME
FROM PRTASK T
LEFT OUTER JOIN INV_INVESTMENTS ON T.PRPROJECTID = INV_INVESTMENTS.ID
WHERE T.PRNAME = CASE
WHEN (T.PRNAME = 'Concept Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept Tech PEP Meeting Date'
WHEN (T.PRNAME = 'Concept BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Concept BRU Meeting Date'
WHEN (T.PRNAME = 'End of Concept Phase' AND T.PRSTATUS != 2) THEN 'End of Concept Phase'
WHEN (T.PRNAME = 'Evaluate Tech PEP Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate Tech PEP Meeting Date'
WHEN (T.PRNAME = 'Evaluate BRU Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate BRU Meeting Date'
WHEN (T.PRNAME = 'Evaluate TSC Meeting Date' AND T.PRSTATUS != 2) THEN 'Evaluate TSC Meeting Date'
WHEN (T.PRNAME = 'End of Evaluate Phase' AND T.PRSTATUS != 2) THEN 'End of Evaluate Phase'
WHEN (T.PRNAME = 'End of Analyse Phase' AND T.PRSTATUS != 2) THEN 'End of Analyse Phase'
WHEN (T.PRNAME = 'End of Design Phase' AND T.PRSTATUS != 2) THEN 'End of Design Phase'
WHEN (T.PRNAME = 'End of Build Phase' AND T.PRSTATUS != 2) THEN 'End of Build Phase'
WHEN (T.PRNAME = 'End of Test Phase' AND T.PRSTATUS != 2) THEN 'End of Test Phase'
WHEN (T.PRNAME = 'In Service' AND T.PRSTATUS != 2) THEN 'In Service'
WHEN (T.PRNAME = 'End of Implement Phase' AND T.PRSTATUS != 2) THEN 'End of Implement Phase'
WHEN (T.PRNAME = 'End of Closure Phase' AND T.PRSTATUS != 2) THEN 'End of Closure Phase'
ELSE 'In Service'
END
AND INV_INVESTMENTS.CODE = '007058'
maintenant, cependant, que je reçois plusieurs déclarations QUAND le retour des valeurs quelqu'un peut-il confirmer si oui ou non les instructions CASE reviennent vraiment que la première valeur TRUE
Vous devez utiliser ou une instruction au lieu de ET dans les deuxième et troisième cas. par exemple. déclaration (T.PRNAME = 'TECH PEP MEETING DATE' ET T.PRSTATUS = 2) ET (T.PRNAME = 'BRU MEETING DATE' et T.PRSTATUS! = 2) devrait être écrit comme ceci (T.PRNAME = 'TECH PEP MEETING DATE' et T.PRSTATUS = 2) OU (T.PRNAME = 'DATE DE RÉUNION DE BRU' ET T.PRSTATUS! = 2) –
@Matthew base sur votre erreur maintenant, le problème est dans votre sous-requête 'SELECT', il retourne plus de 1 ligne/enregistrement, essayez de vérifier votre déclaration' SELECT' spéciailly sur la condition 'WHERE' si pourquoi il renvoie plus de 1 lignes. – Japongskie
@Matthew avez-vous essayé le 3ème 'WHEN', il y a aussi une déclaration select' SELECT TO_CHAR (MAX (T.PRFINISH), 'DD/MM/YY') À PARTIR DE PRTASK T Où T.PRPROJECTID = INV_INVESTMENTS.ID ET Upper (T.PRNAME) = 'TSC MEETING DATE' et PRISMILESTONE = 1 et ROWNUM = 1', essayez de bien vouloir retourner 1 enregistrement. – Japongskie