web-dev-qa-db-fra.com

Instruction If dans la clause Where

Je travaille avec une requête qui contient des instructions "IF" dans une clause "WHERE". Mais PL\SQL Developer donne des erreurs lors de son exécution. Quelqu'un peut-il m'aider à répondre à la bonne question? Voici la requête:

SELECT t.first_name,
       t.last_name,
       t.employid,
       t.status
  FROM employeetable t
 WHERE IF status_flag = STATUS_ACTIVE then t.status = 'A'
       IF status_flag = STATUS_INACTIVE then t.status = 'T'
       IF source_flag = SOURCE_FUNCTION then t.business_unit = 'production'
       IF source_flag = SOURCE_USER then t.business_unit = 'users'
   AND t.first_name LIKE firstname
   AND t.last_name LIKE lastname
   AND t.employid LIKE employeeid;

Je reçois l'erreur "ORA-00920: opérateur relationnel invalide".

Placer des crochets autour de status_flag = STATUS_ACTIVE entraîne l'erreur "ORA-00907: parenthèse droite manquante"

12
user2100620

CASE pourrait vous aider:

SELECT t.first_name,
       t.last_name,
       t.employid,
       t.status
  FROM employeetable t
 WHERE t.status = (CASE WHEN status_flag = STATUS_ACTIVE THEN 'A'
                        WHEN status_flag = STATUS_INACTIVE THEN 'T'
                        ELSE null END)
   AND t.business_unit = (CASE WHEN source_flag = SOURCE_FUNCTION THEN 'production'
                               WHEN source_flag = SOURCE_USER THEN 'users'
                               ELSE null END)
   AND t.first_name LIKE firstname
   AND t.last_name LIKE lastname
   AND t.employid LIKE employeeid;

instruction CASE évalue plusieurs conditions pour produire une seule valeur. Donc, lors de la première utilisation, je vérifie la valeur de status_flag, en retournant 'A', 'T' ou null en fonction de sa valeur, et je compare cela à t.status. Je fais de même pour la colonne business_unit avec une deuxième instruction CASE.

11
DCookie

Vous ne pouvez pas utiliser IF comme ça. Vous pouvez faire ce que vous voulez avec AND et OR:

SELECT t.first_name,
       t.last_name,
       t.employid,
       t.status
  FROM employeetable t
 WHERE ((status_flag = STATUS_ACTIVE   AND t.status = 'A')
     OR (status_flag = STATUS_INACTIVE AND t.status = 'T')
     OR (source_flag = SOURCE_FUNCTION AND t.business_unit = 'production')
     OR (source_flag = SOURCE_USER     AND t.business_unit = 'users'))
   AND t.first_name LIKE firstname
   AND t.last_name  LIKE lastname
   AND t.employid   LIKE employeeid;
4
John Kugelman