SQL语句中的动态别名

时间:2009-10-14 15:40:35

标签: sql sql-server sql-server-2005 tsql

我想根据SQL Server查询中某些其他列名的值显示别名。对于例如

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

我知道上述情况不对,但这样的事情会有所帮助。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

“别名”名称是您要返回的数据的整个列的名称。这不可能在“按行”的基础上进行更改。

动态更改列名(别名)的唯一方法是使用动态SQL来构建查询。但是,这似乎不是您想要做的。

答案 2 :(得分:1)

您需要将金额作为“金额”返回,然后返回包含该金额“类型”的额外列。

i.e.g

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

答案 3 :(得分:1)

不能做......

SQL返回一个recorset,每列只能有一个名称/别名
如果查询返回的某些记录是“个人”而某些是其他类型的,那么它会选择哪个名称?

当然,正如几个响应中所建议的那样,您可以修改查询返回的列数,并根据需要为每个列命名,但是处理这样的结果集,然后可能需要额外的逻辑,这会破坏目的,因为如果一个人想要额外的逻辑,他/她可以只选择金额和类型,并在属性命名中处理这些值,例如在应用程序级别......

答案 4 :(得分: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

我认为你可能需要重新审视你的设计。