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"
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.
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;