我有一个SQL Server 2005查询,我在Select语句中使用case语句。我想知道这样做的“正确”方法是什么。
每种格式似乎都运行得很好,但我想知道不同选择之间是否存在一些冗余。
示例格式:
SELECT 'isItemDisplayed' = CASE WHEN ... THEN ... END FROM myTable
SELECT isItemDisplayed = CASE WHEN ... THEN ... END FROM myTable
SELECT CASE WHEN ... THEN ... END AS isItemDisplayed FROM myTable
SELECT CASE WHEN ... THEN ... END AS 'isItemDisplayed' FROM myTable
SELECT CASE WHEN ... THEN ... END isItemDisplayed FROM myTable
答案 0 :(得分:3)
参考this页面底部的示例,我会说:
SELECT CASE WHEN ... THEN ... END AS isItemDisplayed FROM myTable
因为它明确定义了isItemDisplayed
作为名称。
我个人更喜欢:
SELECT CASE WHEN ... THEN ... END AS [isItemDisplayed] FROM myTable
因为它涵盖了保留字(即使你不应该命名任何与保留字相同的东西),你可以包含空格。
根据this博客,不使用任何明确的标识符(=
或As
)是不好的做法。
在别名周围使用单引号没有任何优势,除了SSMS将名称显示为不同的颜色,可能会让它突然出现?
答案 1 :(得分:2)
这与CASE声明无关。您可以为选择列表中的任何表达式创建列别名,包括简单的列名称(即:重命名以匹配客户端代码),文字表达式,函数调用等。但继续您的CASE示例,有一些事情知道。
我几乎从来没有这样看过,但ANSI Sql标准说使用双引号作为名称,如下所示:
SELECT CASE WHEN ... THEN ... END "isItemDisplayed" FROM myTable
我常见的是原始问题中的第3或第5个选项,如下所示。要么是好的:
SELECT CASE WHEN ... THEN ... END As isItemDisplayed FROM myTable
SELECT CASE WHEN ... THEN ... END isItemDisplayed FROM myTable
如果您想要一个与保留字冲突或使用空格的名称,其中任何一个都允许您将名称包含在方括号([]
)中。我会避免任何使用=
语法的内容,因为它可能会使您正在寻找布尔结果的人感到困惑。我在这里给出的另一个建议是选择一种风格并在当前环境中坚持使用它。 一致性!
答案 2 :(得分:0)
我认为这是首选: -
SELECT CASE WHEN ... THEN ... END AS isItemDisplayed FROM myTable
前两个用于比较CASE语句与名称的结果。最后的结果是我们指定为ALIAS。
刚发现这个link很有意思(正如Lamak在评论中提到的那样):
我个人我发现别名周围的单引号会分散注意力, 无论哪种别名都使选择列表更难阅读 您使用的约定。所有别名都是字符串;我为什么要这样做 让它看起来像是数据?另请注意#5和#6 没有任何标准的定义,它们似乎只是被允许进入 语法
答案 3 :(得分:0)
我想你的问题是关于ANSI SQL标准,以及Microsoft实现中的特性
第一个,第一个=第二个语句,第三个=第四个=第五个,但是第一个!=第三个,因为它比较,而3-5返回值 - 更新:对于MS SQL,所有这些查询是相同的,对于其他一些他们的数据库可能不同
无论如何,我们可以将您的问题简化为这两个问题:
转义标识符的正确方法是什么
如果您使用不能与保留字混合的标识符 - 您不需要用任何特殊符号将其括起来,但如果您不确定 - 最好使用它们
标准SQL定义"
符号作为标识符分隔符,但MS SQL支持其他符号(如[]),因此您可以使用其中任何一个,但最好"
,请查看{{3 }}
我们应该使用AS
还是
关键字AS
在SQL标准中是可选的,在MS实现中是可选的,但对于所有DBMS都不是这样的
检查http://en.wikibooks.org/wiki/SQL_Dialects_Reference/Data_structure_definition/Delimited_identifiers - 关键字[AS] - 这意味着本文档的可选项
最后回答:
确保您的查询始终按预期工作 - 使用转义并使用AS关键字,这将在其他数据库的情况下帮助您,或者如果在新版本的MS SQL中引入某些不兼容的更改
所以,这个查询会更好:
SELECT CASE WHEN ... THEN ... END AS "isItemDisplayed" FROM "myTable"