En tant que développeur web, je sais utiliser IF ELSE en plusieurs langues. Cependant, j'apprends à rédiger des rapports à l'aide de TOAD pour Oracle.
Ma question est la suivante: comment ajouter correctement une instruction IF ELSE?
C'est ce que j'essaie de faire. L'erreur est: La commande n'est pas terminée correctement.
(VIKKIE à ICKY m'a été chargé par mon superviseur de m'aider à apprendre)
SELECT DISTINCT a.item, b.salesman, NVL(a.manufacturer,'Not Set')Manufacturer
FROM inv_items a, arv_sales b
WHERE a.co = '100'
AND a.co = b.co
AND A.ITEM_KEY = b.item_key
--AND item IN ('BX4C', 'BX8C', 'BX866') --AND salesman ='15'
AND a.item LIKE 'BX%'
AND b.salesman in ('01','15')
AND trans_date BETWEEN to_date('010113','mmddrr')
and to_date('011713','mmddrr')
GROUP BY a.item, b.salesman, a.manufacturer
ORDER BY a.item
IF b.salesman = 'VIKKIE' THEN
a.salesman := 'ICKY';
END IF;
IF
est une construction PL/SQL. Si vous exécutez une requête, vous utilisez SQL et non PL/SQL.
En SQL, vous pouvez utiliser une instruction CASE
dans la requête elle-même
SELECT DISTINCT a.item,
(CASE WHEN b.salesman = 'VIKKIE'
THEN 'ICKY'
ELSE b.salesman
END),
NVL(a.manufacturer,'Not Set') Manufacturer
FROM inv_items a,
arv_sales b
WHERE a.co = '100'
AND a.co = b.co
AND A.ITEM_KEY = b.item_key
AND a.item LIKE 'BX%'
AND b.salesman in ('01','15')
AND trans_date BETWEEN to_date('010113','mmddrr')
and to_date('011713','mmddrr')
ORDER BY a.item
Comme vous ne faites aucune agrégation, vous ne voulez pas de GROUP BY
dans votre requête. Êtes-vous vraiment sûr d'avoir besoin du DISTINCT
? Les gens jettent souvent cela au hasard ou l'ajoutent lorsqu'ils manquent une condition de jointure plutôt que de se demander s'il est vraiment nécessaire de faire le travail supplémentaire pour identifier et supprimer les doublons.
Vous pouvez également utiliser Decode
:
SELECT DISTINCT a.item, decode(b.salesman,'VIKKIE','ICKY',Else),NVL(a.manufacturer,'Not Set')Manufacturer
FROM inv_items a, arv_sales b
WHERE a.co = b.co
AND A.ITEM_KEY = b.item_key
AND a.co = '100'
AND a.item LIKE 'BX%'
AND b.salesman in ('01','15')
AND trans_date BETWEEN to_date('010113','mmddrr')
and to_date('011713','mmddrr')
GROUP BY a.item, b.salesman, a.manufacturer
ORDER BY a.item