web-dev-qa-db-fra.com

Utilisation d'IF ELSE dans Oracle

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; 
9
Frankie G

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.

23
Justin Cave

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
5
Dileep