两个查询之间的差异'选择语句'使用别名表名称

时间:2013-11-09 16:43:43

标签: sql sql-server alias

我想问一下这两个查询之间的区别:

select ProductName = case when p.ProductID is null then 'Unknown' else p.ProductName end

select p.ProductName = case when p.ProductID is null then 'Unknown' else p.ProductName end

(p是表Product的别名)

在sql server management studio 2008 R2中它们有什么区别?当我执行第一个时,它被成功执行,但是对于第二个,我收到一条错误消息“'='附近的语法不正确。”

任何人都能解释一下这个吗?感谢。

1 个答案:

答案 0 :(得分:1)

在第一种情况下ProductName不是表格列,而是别名。想到这样:

select case when p.ProductID is null then 'Unknown' else p.ProductName end as ProductName

在第二个不正确的查询中,您尝试执行非法操作,因为您尝试从表中选择一个列并将其分配给它,就像它是从表达式生成的别名一样。

我认为您的疑惑是您认为ProductName始终是一个列,因为该表中有一个具有该名称的列,但在此上下文中ProductName 不是列名;它是case语句结果的别名。所以当你尝试p.ProductName时,你告诉SQL引擎从ProductName表中选择p列,然后你尝试分配一个case语句就好像它是一个别名(它是不在p.ProductName上下文中。

您可以轻松地将任何名称用于case语句,因为它是别名。你可以这样做:

select DerivedProductName = case when p.ProductID is null then 'Unknown' else p.ProductName end

这个例子是否更清楚你在使用这种语法时没有处理列名?