28

我见过一些人使用单引号来别名列名,例如:

select orderID 'Order No' from orders

和其他人使用方括号,例如:

select orderID [Order No] from orders

我倾向于使用方括号。有什么偏好/差异吗?

4

5 回答 5

76

要回答“是否有任何偏好/差异”的问题:

是的,有多少意见就有多少偏好,但要小心你采纳了谁的偏好。

作为最佳实践,如果不需要任何额外的工作,建议编写可移植的 SQL。

对于您的特定示例,编写可移植查询同样容易......

select OrderId as "Order Id" from Orders

...因为它是写一个非便携式的:

select OrderId as [Order Id] from Orders

当存在具有相同击键次数的等效可移植形式时,最好不要编写非标准 SQL。

用于转义的 [] 的激增是由于 SQL Server Management Studio 和 MS Access 查询生成器等工具懒惰地转义一切。在 SQL Server 中度过他/她的职业生涯的开发人员可能永远不会想到,但这些年来,将 Access 和 SQL Server 应用程序移植到其他数据库平台时,括号已经造成了大量费用。引用所有内容的 Oracle 工具也是如此。未经培训的开发人员将 DDL 视为示例,然后在手写时继续使用相同的样式。在工具改进并且我们要求更好之前,这是一个很难打破的循环。在 Oracle 中,引用结合混合大小写会产生区分大小写的数据库。我见过人们引用数据库中每个标识符的项目,

如果您从一开始就使用规范化的合法标识符(使用 OrderId 或 order_Id 而不是 [Order Id])编写 DDL,您不必担心可能需要转义字符的神秘关键字;当您'已经使用了保留字。我可以指望我们曾经将应用程序从一个版本的 SQL Server 升级到另一个版本并且由于新的保留字而出现任何损坏的次数。

这通常是激烈辩论的主题,所以如果您换一种方式考虑:

C# 程序员不会使用 @ 转义所有变量,即使这样做是合法的。这将被认为是一种奇怪的做法,并且会成为 StackOverflow 上的嘲笑对象。转义应该用于边缘情况。但是编写符合 C# 标识符的开发人员并不介意在他们的 SQL 中转义每个标识符,编写非常丑陋、不可移植的 SQL“代码”。作为一名顾问,我遇到过不止一位 SQL Server 程序员,他们真诚地认为 [] 是必需的语法。我不怪开发者;我责怪工具。

于 2014-04-13T22:07:50.943 回答
6

's 是否有效取决于您的有效设置。而你错过了"。请参阅分隔标识符

当 QUOTED_IDENTIFIER 设置为 ON 时,SQL Server 遵循 ISO 规则在 SQL 语句中使用双引号 (") 和单引号 (')。例如:

  • 双引号只能用于分隔标识符。它们不能用于分隔字符串。

  • 必须使用单引号将字符串括起来。它们不能用于分隔标识符。


当 QUOTED_IDENTIFIER 设置为 OFF 时,SQL Server 对单引号和双引号使用以下规则:

  • 引号不能用于分隔标识符。相反,必须使用括号作为分隔符。

  • 可以使用单引号或双引号将字符串括起来。

最后:

无论 QUOTED_IDENTIFIER 的设置如何,始终可以使用括号中的分隔符

在上述所有引用中,当他们提到括号时,他们正在谈论[]括号。

于 2013-10-29T11:51:57.823 回答
5

单引号更具可读性。如上所示,以红色突出显示。

MySQL 使用 `backticks` 来转义特殊字符。

MSSQL 可以使用“双引号”或 [括号] 表示标识符(表、列等)
,使用“单引号”表示字符串或别名。

方括号主要用于封装对象,以便空格、句点或连字符等特殊字符不会引发语法错误。

我建议在列别名之前使用“as”关键字 - 它更具可读性。

select [column with spaces] as 'my col' from "table with spaces" where n = 'foo'
select "column with spaces" as 'my col' from [table with spaces] where n = 'foo'
于 2013-10-29T11:51:42.380 回答
2

引用方法使您能够做到这一点:

SELECT 1 AS 'bla[]bla'
于 2013-10-29T11:43:45.410 回答
0

感谢贾斯汀格兰特在此线程的评论中 - 发布这是作为可见性的完整答案。

如果我们接受一般偏好是主观的,但一致性是可取的,那么就实际差异而言,有充分的理由不使用单引号'。如果您需要在名称需要引用的列上使用例如聚合函数,单引号会给您带来麻烦(代码直接从贾斯汀的评论中复制/粘贴):

select sum ('foo') from (select 1 as 'foo') x

在我看来,这就是不使用单引号的充分理由——在某些情况下你不能使用它们,这会妨碍一致性。

因此,双引号"或括号[]是唯一的方法。这归结为您更看重哪种一致性 - 与 SQL Server 特定工具可能生成的代码保持一致,将使用括号,或遵守指定双引号的 ANSI 标准。在充分根深蒂固的 Microsoft 环境中,括号可能更有意义。如果没有这一点,双引号可能是更好的做法。

于 2021-03-18T04:24:36.543 回答