2009-10-14 18 views
9

Desidero visualizzare il nome di alias in base al valore di un altro nome di colonna nella query in SQL Server. Ad es.Alias ​​dinamici nell'istruzione SQL

SELECT P.Amount AS (CASE P.Type WHEN 'Individual' THEN 'Salary' ELSE 'Profit' END) 
    FROM Person P 

So che quanto sopra non è giusto, ma qualcosa di simile aiuterà.

risposta

12

Non so se è possibile aggiungere alias dinamici, ma dovresti essere in grado di fare qualcosa del genere (se hai solo pochi possibili alias):

SELECT 
    CASE P.Type WHEN 'Individual' THEN P.Amount ELSE NULL END AS Salary, 
    CASE P.Type WHEN 'Individual' THEN NULL ELSE P.Amount END AS Profit 
FROM 
    Person p 
+0

+1 Buon punto, questo può effettivamente fare ciò che sta cercando. Non ci ho pensato. –

+0

Grazie, questo è sicuramente l'affare più vicino che potrei ottenere –

1

È necessario restituire Importo come "Importo" e quindi restituire una colonna aggiuntiva contenente il "tipo" per tale importo.

i.e.g

SELECT P.Amount, CASE P.Type WHEN 'Individual' THEN 'Salary' ELSE 'Profit' END AS AmountType 
FROM Person P 
2

Il "Alias" nome è il nome della intera colonna dei dati si sta tornando. Non è possibile che questo cambi su base "per riga".

L'unico modo per modificare dinamicamente un nome di colonna (alias) è l'utilizzo di SQL dinamico per creare la query. Tuttavia, questo non sembra essere ciò che si vuole fare.

+2

E a questo punto, anche SQL dinamico sarà in grado di scegliere UN nome per l'alias per un'intera query. – mjv

1

Non può fare ...

SQL restituisce un recorset che può avere un solo nome/alias per ogni colonna.
Quale nome sceglierebbe nell'esempio dato se alcuni record restituiti dalla query erano "Individuali" e altri erano di un altro tipo?

Naturalmente, come suggerito in diverse risposte, è possibile modificare il numero di colonne restituite dalla query e denominare ogni colonna come desiderato, ma trattando tale insieme di risultati che può richiedere una logica aggiuntiva, che vanificherebbe lo scopo dal se si desidera una logica aggiuntiva, è sufficiente selezionare sia la quantità che il tipo e correggere questi valori per la denominazione degli attributi e così via a livello dell'applicazione ...

0

Una colonna può avere un solo nome. Se il set di righe conteneva solo una riga, è possibile esaminare prima la colonna Tipo della riga e quindi modificare il nome della colonna in modo appropriato per la selezione. Se contiene più righe, semplicemente non è possibile.

IF 1 = (SELECT COUNT(*) FROM Person P WHERE <where-criteria>) THEN 
    IF 'Individual' = (SELECT P.Type FROM Person P WHERE <where-criteria>) THEN 
     SELECT P.Amount AS Salary 
     FROM Person P 
     WHERE <where-criteria> 
    ELSE 
     SELECT P.Amount AS Profit 
     FROM Person P 
     WHERE <where-criteria> 
    END IF 
ELSE 
    SELECT P.Amount AS SalaryOrProfit 
    FROM Person P 
    WHERE <where-criteria> 
END IF 

Penso che potrebbe essere necessario riesaminare il tuo progetto.