101 votes

Peut-on avoir une logique if-then-else en SQL ?

J'ai besoin de sélectionner des données dans un tableau en fonction d'une sorte de priorité, comme suit :

select product, price from table1 where project = 1

-- pseudo: if no price found, do this:
select product, price from table1 where customer = 2

-- pseudo: if still no price found, do this:
select product, price from table1 where company = 3

C'est-à-dire que si j'ai trouvé 3 produits dont les prix sont basés sur project = X Je ne veux pas sélectionner sur customer = Y . Je veux juste retourner les 3 rangées résultantes et en finir.

Comment faire ce genre de choses en SQL ? Utiliser une sorte d'instruction CASE pour les pseudo-si ? Faire une union ou autre chose d'intelligent ?

Edit : J'utilise MS SQL.

Merci !

0voto

mson Points 4828

Il existe une déclaration de cas, mais je pense que la déclaration ci-dessous est plus précise/efficace/facile à lire pour ce que vous voulez.

select 
  product
  ,coalesce(t4.price,t2.price, t3.price) as price
from table1 t1
left join table1 t2 on t1.product = t2.product and t2.customer =2
left join table1 t3 on t1.product = t3.product and t3.company =3
left join table1 t4 on t1.product = t4.product and t4.project =1

0voto

Lee Points 1

--Réponse similaire à la précédente pour la plupart des cas. Code inclus pour tester

DROP TABLE table1
GO
CREATE TABLE table1 (project int, customer int, company int, product int, price money)
GO
INSERT INTO table1 VALUES (1,0,50, 100, 40),(1,0,20, 200, 55),(1,10,30,300, 75),(2,10,30,300, 75)
GO
SELECT TOP 1 WITH TIES product
        , price
        , CASE WhereFound WHEN 1 THEN 'Project'
                WHEN 2 THEN 'Customer'
                WHEN 3 THEN 'Company'
            ELSE 'No Match'
            END AS Source
FROM 
    (
     SELECT product, price, 1 as WhereFound FROM table1 where project = 11
     UNION ALL
     SELECT product, price, 2 FROM table1 where customer = 0
     UNION ALL
     SELECT product, price, 3 FROM table1 where company = 30
    ) AS tbl
ORDER BY WhereFound ASC

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X