2009-10-14 134 views
9

我想基於一些其他列名在SQL Server查詢中值顯示別名。對於例如動態別名在SQL語句中

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

我知道上述情況並不正確,但類似這樣的情況會有所幫助。

回答

12

我不知道,如果你可以添加動態別名,但你應該可以這樣做(如果你只有幾個可能的別名):

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好點,這實際上可以做他以後的事情。沒想到這個。 – 2009-10-14 15:47:24

+0

謝謝,這絕對是我能得到的最接近的交易 – 2009-10-14 16:03:46

1

你需要恢復量爲「金額」,然後返回包含該金額的「類型」的額外列。

i.e.g

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

「別名」名字是你正在返回數據的整列的名稱。這不可能在「逐行」的基礎上進行更改。

你可以改變一個列名(化名)的唯一方法是動態使用動態SQL建立查詢。但是,這似乎並不是你想要做的。

+2

而那個,甚至是動態的SQL只能爲別名定的查詢的整體選擇一個名字。 – mjv 2009-10-14 15:46:50

1

沒有做不到的......

SQL返回recorset其只能按每一列一個名稱/別名。
它會選擇哪個名字給出的例子,如果查詢返回的一些記錄是'個人',並且一些是其他類型?

當然,正如幾個響應中所建議的那樣,您可以根據需要修改查詢返回的列的數量併爲每列指定名稱,但處理這樣的結果集可能需要額外的邏輯,這會導致失敗如果有人想額外的邏輯,他/她可能只是選擇的數量和類型和屬性命名,並在這樣的應用水平工作過這些價值觀......

0

列可以只有一個名稱。如果您的行集只包含一行,那麼您可以首先查看行的「類型」列,然後針對該選擇適當地更改列名稱。如果它包含多行,那根本不可能。

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 

我想你可能需要重新檢查你的設計。