我想问一下这两个查询之间的区别:
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中它们有什么区别?当我执行第一个时,它被成功执行,但是对于第二个,我收到一条错误消息“'='附近的语法不正确。”
任何人都能解释一下这个吗?感谢。
答案 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
这个例子是否更清楚你在使用这种语法时没有处理列名?