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


12

我一直都将列别名写为

SELECT 1 as ColumnName

但是今天遇到了一个使用了

SELECT ColumnName = 1

这两个查询的执行方式有何不同?还是在DBA中有关于使用哪个标准的标准?

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


2
请注意,注释别名的赋值形式不是可移植的,因此尽管在进行大量派生的列工作时使注释变得易于阅读,但是稍后不得不将其转换为另一个DBMS可能会很烦人。
Cade Roux

@Cade Celko一直在争论某些事情。如果必须将SQL Server代码库转换为Oracle或PG或MySQL,则别名构成将是我最小的麻烦。由于与Celko不同,我不想避免使用所有专有功能,以防万一我们将整个体系结构转移到另一个RDBMS。我想知道这种情况在教室外真正发生的频率是多少...
亚伦·伯特兰

@AaronBertrand我同意大规模转化。我将大量内容转换为Teradata,这是最少的问题。更经常发生的是,我将整个原始表数据导入我自己的SQL Server中,并对它进行视图或查询,或者执行任何分析操作,然后为源编写查询或proc。可以从SSIS调用系统方言,也可以通过其他任何方式恰好获得我想要的数据。在这种情况下,我有意识地编写了非常通用的ANSI风格的SQL。然后,我仍然必须进行更改,例如日期函数。
Cade Roux

Answers:


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;

不是我要检查的代码。


5
我总是很讨厌看到最后一个,其中排除了“ as”关键字。不需要,但是在查看一堆代码时会很痛苦。

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 ...

那是我的偏爱。您的可能会有所不同。除了主观/品味方面的原因外,使用其他任何一种都没有真正的优势。重要的是,您要选择一种方法并始终如一地进行操作(除非您掷硬币,否则在遇到喜欢另一种方法的人时能够捍卫自己的选择)。但是,如果您像我一样为DBA编写繁琐的代码,请准备好对其进行重写。:-)

我已经在博客上写了

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

column AS 'alias'
'alias' = column

不建议使用一种格式,但是两种格式都很难阅读-许多新手都将别名误认为是字符串文字,因为这就是它的样子。基于相同的原因,我绝对不赞成使用双引号("alias")。如果您因为别名是保留字或选择或格式化错误而需要对别名进行转义,请使用[square brackets]


2
完全同意报价方面。对于长表达式,我个人所做的是使用回车符和换行符制表符,然后将其as <Alias>放在列定义的最后一行。但绝对可以同意,它就像您喜欢咖啡一样个性。
Thomas Stringer

@ThomasStringer看到我宁愿回车表达式。如果一行以开头AS AliasAS则在我垂直扫描特定表名时不是很有用。我敢打赌我们也不会同意在哪里放置逗号。:-)
亚伦·伯特兰

我曾经尝试在列别名周围使用单引号,因为这使它们在SSMS中脱颖而出,但是很快输入引号键的烦恼对我来说变得太多了,我又回到了懒惰的方式。另外,当我在查询中包含字符串时,它就无法达到预期的目的。我可能会坚持下去,AS因为这是我们现在使用的(我通常在此之前添加一个换行符,AS ColumnName以便它们大致对齐),但是我同意=在更长的列定义中它更具可读性。
Rachel

2
@AaronBertrand我将逗号放在首位的论点是,它使更容易分辨列定义从何处开始,尤其是在多行列定义中。
雷切尔

1
@AaronBertrand我通常不使用有意义的缩进代码>。<
Rachel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.