2013-02-14 8 views
5

Sto provando a selezionare un diverso insieme di risultati per un prodotto in base a un tipo di prodotto. Quindi, se il mio prodotto dovesse essere un libro, voglio che guardi l'UPC e l'Artista per un prodotto normale questi dettagli sono comunque irrilevanti e per un altro prodotto vorrei un insieme di risultati completamente diverso.SELEZIONARE CASO QUANDO POI (SELEZIONA)

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 

io non sono sicuro di dove sto andando male

+0

Metti l'SQL in un violino - sqlfiddle.com –

risposta

0

Per cominciare la prima SELECT ha 6 colonne e la seconda ha 4 colonne. Forse entrambi hanno lo stesso numero di colonne (aggiungendo null?).

6

Si potrebbe provare l'altro formato per l'istruzione case

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

) 
END 
FROM Product 
WHERE Product.product_id = $pid 

Vedi http://msdn.microsoft.com/en-us/library/ms181765.aspx per ulteriori informazioni.

+2

Questo è davvero negativo per le prestazioni. Dovresti piuttosto usare un join, altrimenti ogni volta che questa query viene eseguita farebbe un altro select per ogni riga. Molto costoso. Si prega di vedere la soluzione alternativa di seguito. –

0

Ho finito per lasciare le proprietà comuni dalle query SELECT e creare una seconda query SELECT più avanti nella pagina. Ho usato un comando php IF per chiamare diversi script in base alla prima query SELECT, gli script contenevano la seconda query SELECT.

5

È consigliabile evitare l'uso di selezioni nidificate e direi che non dovresti mai usarli nella parte selezionata effettiva della tua istruzione. Esegui quella selezione per ogni riga che viene restituita. Questa è un'operazione molto costosa. Piuttosto usa i join. È molto più leggibile e le prestazioni sono molto migliori.

Nel tuo caso la domanda qui sotto dovrebbe aiutare. Nota che la dichiarazione dei casi è ancora lì, ma ora è una semplice operazione di confronto.

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 

Ho utilizzato un join di sinistra poiché non conosco la logica di business.

Problemi correlati