web-dev-qa-db-fra.com

SÉLECTIONNEZ LE CAS QUAND ALORS (SÉLECTIONNEZ)

J'essaie de sélectionner un ensemble de résultats différent pour un produit en fonction d'un type de produit. Donc, si mon produit doit être un livre, je veux qu'il recherche le UPC et artiste pour un produit normal, ces détails ne sont cependant pas pertinents et pour un autre produit, je voudrais un ensemble de résultats complètement différent.

SELECT CASE Product.type_id
    WHEN 10 THEN (
        SELECT 
        Product.product_id, 
        Product.type_id, 
        Product.product_name, 
        Product.UPC,
        Product_Type.type,
        CONCAT_WS(' ' , first_name, middle_name, last_name ) AS artistC 
        FROM Product, Product_Type, Product_ArtistAuthor 
        WHERE Product.type_id = Product_Type.type_id 
        AND Product.product_id = $pid
        AND Product.artist_id = Product_ArtistAuthor.artist_id
    )
    ELSE (
        SELECT 
        Product.product_id, 
        Product.type_id, 
        Product.product_name,
        Product_Type.type 
        FROM Product, Product_Type 
        WHERE Product.type_id = Product_Type.type_id 
        AND Product.product_id = $pid
    )
END
FROM Product 
WHERE Product.product_id = $pid

Je ne sais pas où je vais mal

7
Stewart Haffenden

Vous pourriez essayer l'autre format pour la déclaration de cas

CASE WHEN Product.type_id = 10
THEN
(
  Select Statement
)
ELSE
(
  Other select statement

)  
END
FROM Product 
WHERE Product.product_id = $pid

Voir http://msdn.Microsoft.com/en-us/library/ms181765.aspx pour plus d'informations.

8
Kevin Kunderman

Vous devez éviter d'utiliser des sélections imbriquées et j'irais jusqu'à dire que vous ne devriez jamais les utiliser dans la partie de sélection réelle de votre déclaration. Vous exécuterez cette sélection pour chaque ligne renvoyée. C'est une opération vraiment coûteuse. Utilisez plutôt les jointures. Il est beaucoup plus lisible et les performances sont bien meilleures.

Dans votre cas, la requête ci-dessous devrait vous aider. Notez que l'instruction cases est toujours là, mais maintenant c'est une opération de comparaison simple.

select
    p.product_id,
    p.type_id,
    p.product_name,
    p.type,
    case p.type_id when 10 then (CONCAT_WS(' ' , first_name, middle_name, last_name )) else (null) end artistC
from
    Product p

    inner join Product_Type pt on
        pt.type_id = p.type_id

    left join Product_ArtistAuthor paa on
        paa.artist_id = p.artist_id
where
    p.product_id = $pid

J'ai utilisé une jointure gauche car je ne connais pas la logique métier.

5
Ryan-Neal Mes

Pour commencer, la première sélection a 6 colonnes et la seconde a 4 colonnes. Peut-être que les deux ont le même nombre de colonnes (en ajoutant des valeurs nulles?).

0
Ed Heal

J'ai fini par laisser les propriétés communes des requêtes SELECT et faire une deuxième requête SELECT plus tard dans la page. J'ai utilisé une commande php IF pour appeler différents scripts en fonction de la première requête SELECT, les scripts contenaient la deuxième requête SELECT.

0
Stewart Haffenden