2013-10-15 112 views
2

我有一個SQL Server 2005查詢,我在Select語句中使用了一個case語句。我想知道做到這一點的「正確」方式是什麼。SQL 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

'SELECT CASE WHEN ... THEN ... END AS isItemDisplayed FROM myTable'將是最標準的符合我的想法。 –

+0

只是不要使用像這樣的單引號別名:''isItemDisplayed''請參閱:[壞習慣踢:使用AS而不是=列別名](http://sqlblog.com/blogs/aaron_bertrand/archive/ 2012/01/23/bad-habits-to-kick-using-as-instead-of-column-aliases.aspx) –

+1

即使這是*主要是喜好的事情,也有好的做法。這裏是一個相關的帖子:http://sqlblog.com/blogs/aaron_bertrand/archive/2012/01/23/bad-habits-to-kick-using-as-instead-of-for-column-aliases.aspx – Lamak

回答

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 

這些要麼也可以讓您在包住,如果你想與保留字衝突或使用空格的名稱方括號([])的名稱。我會避免使用任何使用=語法的語句,因爲它可能會讓某人找不到布爾結果。我可以在這裏給出的另一點建議是選擇一種風格,並堅持在當前的環境中。 一致性!

0

我覺得這是最好的一個: -

SELECT CASE WHEN ... THEN ... END AS isItemDisplayed FROM myTable 

前兩個是用來比較的名稱CASE語句的結果。最後一個結果,我們正在分配爲ALIAS。

剛剛發現這個link有趣的(正如在評論中提到由Lamak):

個人我發現周圍別名單引號會分心, 使得選擇列表更難讀無論哪個混疊 約定你使用。所有別名都是字符串;爲什麼我要 使它看起來像是有意成爲數據?另外請注意,#5,#6 沒有在任何標準的定義,他們似乎只是被允許進入 語法

3

引用在this頁面底部的例子,我會說:

SELECT CASE WHEN ... THEN ... END AS isItemDisplayed FROM myTable 

,因爲它明確定義了isItemDisplayed作爲名稱。

我個人寧願:

SELECT CASE WHEN ... THEN ... END AS [isItemDisplayed] FROM myTable 

,因爲它涵蓋了保留字(即使你永遠不應該命名什麼一樣保留字),你可以包含空格。

根據this博客,沒有使用任何明確的標識符(=AsAs)是不好的做法。

在別名周圍使用單引號沒有什麼優勢,除了SSMS將名稱顯示爲不同的顏色,可能會使其突出顯示?

+0

您錯過了該博文的要點。它顯示了對'='與'AS'的偏好。 –

+0

感謝您的獲獎@yypercube,更新以反映這一點。 – Elias

0

我想你的問題是關於ANSI SQL標準,並在微軟實施的特殊性

第一,1 = 2日聲明,和第3 = 4 = 5,但第一次!= 3,因爲它比較,而3-5返回值 - 更新:對於MS SQL所有這些查詢都是一樣的,對於一些其他的DB它們可以是不同的

無論如何,我們可以簡化您的問題,只是對這兩個問題:

什麼是逃避標識符的正確方式

,如果你使用的標識符不能與保留字混合 - 你不需要有任何特殊的符號括起來,但如果你不知道 - 這是更好地使用它們

標準SQL定義"符號作爲標識符定界符,但MS SQL支持附加的那些(如[]),因此可以使用它們中的任何,但"是優選的,檢查出http://en.wikibooks.org/wiki/SQL_Dialects_Reference/Data_structure_definition/Delimited_identifiers

我們應該使用AS或不

關鍵字AS是在SQL標準中是可選的,其在MS執行可選的,但是這並不適用於所有DBMS

檢查http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt是真實的 - 關鍵字[AS] - 這意味着選購了本文檔

終於回答:

,以確保您的查詢總是按預期工作 - 用逃避和使用AS關鍵字,這將幫助你在另一個DB的情況下,或者一些不兼容的改變將在MS的新版本中推出的SQL

所以,這個查詢會更好:

SELECT CASE WHEN ... THEN ... END AS "isItemDisplayed" FROM "myTable"

+0

我想你還沒有使用SQL Server,或者你還沒有遇到過這種語法。第一次和第二次聲明沒有比較。在SQL-Server中,所有5個都是相同的(除了最近版本中棄用的第一個)。 –

+0

@ypercube我實際上並沒有在ms sql中嘗試所有查詢,因爲我現在沒有安裝它,但是從一般的SQL點的觀點 - 這是比較,如果MS SQL爲AS添加了特殊語法 - 你是對的,我沒有使用它,也不建議使用它,因爲它是混淆 –