2012-01-06 21 views
6

是否可以在CONVERT或CAST函數中使用比較運算符?爲什麼不在CONVERT中進行比較?

我有看起來像這樣的聲明:

SELECT 
    ... 
    CASE field 
     WHEN 'Y' THEN 1 # If Y then True 
     ELSE 0   # Anything else is False 
    END 
    ... 
FROM ... 

類似的事情發生了幾場,所以我想將其更改爲一個較短的版本:

SELECT 
    ... 
    CONVERT(BIT, field = 'Y') 
    ... 
FROM ... 

但MSSQL給出了一個錯誤Incorrect syntax near '='.

我的幫助解釋是它應該工作:

  • CONVERT (data_type [ (length) ] , expression [ , style ])
  • expression: expression { binary_operator } expression
  • binary_operator:是定義的方式組合兩個表達式,以產生一個結果的運算符。 binary_operator可以是算術運算符,賦值運算符(=),位運算符,比較運算符,邏輯運算符,字符串拼接運算符(+)或一元運算符。
  • comparison operator: (= | > | < | >= | <= | <> | != | !< | !>)

我跑了幾個測試,並得到了這些結果:

SELECT CONVERT(BIT, 0)  // 0 
SELECT CONVERT(BIT, 1)  // 1 
SELECT CONVERT(BIT, 1+2)  // 1 
SELECT CONVERT(BIT, 1=2)  // Error 
SELECT CONVERT(BIT, (1=2)) // Error 
SELECT CONVERT(BIT, (1)=(2)) // Error 
+0

field ='Y'是一個賦值,而不是表達式。在任何情況下,位數據類型只能包含0或1. CASE語句是正確的,因爲它在field ='Y'時指定1。 – 2012-01-06 03:36:00

回答

4

我認爲你曲解的文檔CONVERTCONVERT的文檔中沒有任何內容說明它將處理使用比較運算符的表達式,只是它接受表達式。事實證明,CONVERT不處理每個有效的SQL表達式。至少它不能處理使用比較運算符的表達式的結果。

如果您檢查Operators的文件,你會看到比較操作(這是你想要=是什麼,在這種情況下)返回Boolean數據類型,並在WHERE子句和控制的使用流語句。從運營商的文檔:

比較運算符的結果具有布爾數據類型,它有三個值: TRUE,FALSE,和UNKNOWN。返回布爾型數據類型的表達式稱爲 布爾表達式。

與其他SQL Server數據類型不同,不能將 指定爲表列或變量的數據類型,並且不能在結果集中返回 。

...

表達式與布爾數據類型WHERE子句中用於 濾波器符合搜索條件,並在 控制流語言語句如if和while行.. 。

這有助於解釋爲什麼像SELECT 1=2 SQL是無效的SQL,因爲它會創建一個具有Boolean數據類型,該文件說,是不允許的結果集。這也解釋了爲什麼CASE WHEN構造是必需的,因爲它可以評估比較運算符並返回SQL Server可以在結果集中返回的單個數據類型值。

此外,如果你看一下CONVERT的文件,你會看到Boolean沒有在任何CASTCONVERT支持(請參閱向頁面中間的桌子,沒有Boolean數據類型在那裏)。

爲了您的目的,我認爲您被卡住使用CASE WHEN。如果它可以幫助你可以寫都放在同一行:

CASE WHEN field = 'Y' THEN 1 ELSE 0 END 

或者,你可以創建一個UDF來處理CASE表達式(類似dbo.func_DoCase(field, 'Y', 1, 0)),但我個人只想堅持與CASE WHEN

+0

+1我懷疑你是對的。我正準備說這個,但你打敗了我。 – Wiseguy 2012-01-06 03:45:50

+0

@Wiseguy:謝謝。我知道SQL'SELECT CONVERT(BIT,1 = 2)'是無效的,但試圖弄清楚爲什麼使用文檔有點困難。 – rsbarro 2012-01-06 03:49:28

+0

是的,你會認爲文檔會清楚地指出這一點,並且/或者拋出的錯誤會更有幫助。 「不正確的語法」聽起來更像是一個簡單的拼寫錯誤,而不是「好的,你正確地組裝了這些作品,但是出於非顯而易見的原因,我不覺得有必要解釋它們不屬於這個特定的位置。」 – Wiseguy 2012-01-06 03:59:21

相關問題