7
votes

Sélectionnez le cas quand alors (sélectionnez)

J'essaie de sélectionner un ensemble de résultats différents pour un produit en fonction d'un type de produit. Donc, si mon produit devrait être un livre, je souhaite qu'il recherchera l'UPC et l'artiste pour un produit normal, ces détails sont toutefois désactivés 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


1 commentaires

Mettre le SQL dans violon - sqlfiddle.com


4 Réponses :


0
votes

Pour un démarrage, le premier SELECT compte 6 colonnes et la seconde dispose de 4 colonnes. Peut-être faire les deux avoir le même nombre de colonnes (ajoutant des nulls?).


0 commentaires

13
votes

Vous pouvez essayer l'autre format pour l'instruction de cas xxx

voir http://msdn.microsoft.com/en-us/library/ms181765.aspx Pour plus d'informations.


1 commentaires

C'est vraiment mauvais pour la performance. Vous devez plutôt utiliser une jointure, sinon chaque fois que cette requête fonctionne, elle ferait une autre sélection pour chaque ligne. Très cher. S'il vous plaît voir la solution alternative ci-dessous.



0
votes

J'ai fini par laisser les propriétés communes des requêtes SELECT et effectuez une seconde requête de sélection ultérieure sur la page. J'ai utilisé une commande PHP si commande pour appeler pour différents scripts en fonction de la première requête SELECT, les scripts contenaient la deuxième requête SELECT.


0 commentaires

8
votes

Vous devez éviter d'utiliser des sélectionnées imbriquées et j'irais aussi loin que vous ne devez jamais les utiliser dans la partie sélectionnée de votre relevé. Vous allez exécuter ce choix pour chaque ligne renvoyée. C'est une opération très coûteuse. Utilisez plutôt des jointures. Il est beaucoup plus lisible et la performance est bien meilleure.

Dans votre cas, la requête ci-dessous devrait aider. Notez que la déclaration des cas est toujours là, mais maintenant, il s'agit d'une simple opération de comparaison. P>

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


0 commentaires