将列别名放在列定义的开头或结尾有什么区别吗?

Rac*_*hel 12 sql-server best-practices t-sql

我总是看到并将我的列别名写为

SELECT 1 as ColumnName
Run Code Online (Sandbox Code Playgroud)

但是今天遇到了一个使用的查询

SELECT ColumnName = 1
Run Code Online (Sandbox Code Playgroud)

这两个查询的执行方式有什么不同吗?或者 DBA 之间是否有关于使用哪一个的标准?

我个人认为,第二个会更容易阅读/(很好的例子保持更长的列定义在这里这篇文章),但我从来没有见过,所以今天很奇怪,之前使用的第二语法,如果有某种原因,我不应该使用它。

Tho*_*ger 17

两种类型的别名(与as相对=)的底层功能没有区别。它归结为正是您提到的:可读性和可维护性。

在我看来,前者 ( <Expression> as <Alias>) 更具可读性,因为它是不言自明的。当您拥有时,SELECT ColumnName = 1我认为很容易将其误认为是在那些漫长而疲惫的夜晚设置变量。您可能会误认为SELECT @ColumnName = 1这是完全不同的功能。因此,为了避免查询“双重查找”的任何可能性,甚至更糟......理解/编码错误,我SELECT 1 as ColumnName100% 的时间都去。

个人偏好,但一致性(对您自己和您的团队而言)才是王道。无论你觉得什么最简单,都坚持去做。没有什么比为某人进行故障排除/审查/维护代码来回切换更令人沮丧的了。

第三种未提及的方法是使用<Expression> <Alias>. 换句话说,你的第二种方式没有as关键字。我认为这和=符号一样糟糕。它因为什么而缺乏可读性?不输入三个额外的字符(as和一个空格)。不值得。

出于夸张的目的,看看这样的查询:

use AdventureWorks2012;
go

select
    [New Name] = Name,
    NewDepId = DepartmentID,
    GroupName as GName,
    ModifiedDate MyModDate
from HumanResources.Department;
Run Code Online (Sandbox Code Playgroud)

不是我想要审查的代码。

  • 看到最后一个,他们排除了“as”关键字,总是让我很恼火。不是必需的,但在查看一堆代码时阅读起来很痛苦。 (5认同)

Aar*_*and 10

我个人觉得alias = expression更容易阅读和理解。原因是当我对SELECT包含冗长表达式的语句进行故障排除时,我可能想通过列名查找表达式,而不是相反。快速找到应用程序看到的表达式alias2

SELECT
  alias1 = (long expression with aggregates and multiple column references),
  (long expression with aggregates and multiple column references AS alias2
FROM ...
Run Code Online (Sandbox Code Playgroud)

这是我的偏好。你的可能不同。除了主观/品味原因之外,使用一种或另一种没有真正的优势。重要的是你要选择一种方式去做,并且始终如一(除非你抛硬币,否则当你遇到喜欢另一种方式的人时,能够捍卫你的选择)。但是,如果您为像我一样挑剔的 DBA 编写代码,请做好被重写的准备。:-)

我感觉更强烈的一件事是在别名周围使用单引号,例如

column AS 'alias'
'alias' = column
Run Code Online (Sandbox Code Playgroud)

不推荐使用一种形式,但两种形式都很难阅读 - 许多新手将别名误认为是字符串文字,因为它看起来像这样。出于同样的原因,我绝对讨厌使用双引号 ( "alias")。如果您需要转义别名,因为它是保留字,或者选择或格式不当,请使用[square brackets].

  • 完全同意报价方面。至于长表达式,我个人的做法是使用回车和换行符,然后将`as &lt;Alias&gt;`放在列定义的最后一行。但绝对同意,这与您喜欢咖啡的方式一样个性化。 (2认同)
  • @AaronBertrand 我将逗号放在首位的论点是,它可以更轻松地判断列定义的开始位置,尤其是多行列定义。 (2认同)