2013-02-17 115 views
13

是否支持MS Access的CASE WHEN子句?有沒有其他數據庫不支持CASE WHEN條款?我在使用ODBC連接到MS Access時嘗試了以下查詢,但得到一個異常。如果連接ODBC,MS Access是否支持「CASE WHEN」子句?

SELECT (CASE WHEN (AGE > 10) THEN 1 ELSE 0 END) FROM demo

[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression '(CASE WHEN (AGE > 10) THEN 1 ELSE 0 END)'

我試圖找到這適用於大多數的數據庫,生成(計算)新的「布爾列」有比較表達式,而用ODBC連接的常用方法。實際上,MS Access支持SELECT子句中的比較,但對於某些其他數據庫,CASE子句是必需的。對於MS Access時,SQL可以

SELECT AGE > 10 FROM demo

但在另必須

SELECT (CASE WHEN (AGE > 10) THEN 1 ELSE 0 END) FROM demo

+0

我似乎記得你在MS Access中使用'IIF'而不是'CASE'(這不是特定於ODBC的,只是一般的Access事物)。 – 2013-02-17 10:30:35

+0

是的,但'IIF'是特定的MS Access。我想確保ODBC是否支持MS Access的「CASE」。 – Aaron 2013-02-17 10:34:50

+3

使用ODBC發送語句時,必須使用目標數據庫支持的SQL。 MS Access不支持CASE語句,因此到MS Access的ODBC連接也不能「支持」它們。 – 2013-02-17 11:04:58

回答

9

你可以在下面的例子中使用IIF語句,如:

SELECT 
    IIF(test_expression, value_if_true, value_if_false) AS FIELD_NAME 
FROM 
    TABLE_NAME 
22

由於您使用Access撰寫查詢,你必須堅持到Access的版本的SQL。

要選擇幾個不同的返回值,請使用switch()函數。所以要翻譯和擴展你的例子:

select 
    switch(
    age > 40, 4 
    , age > 25, 3 
    , age > 20, 2 
    , age > 10, 1 
    , true, 0 
) 
from demo 

'true'的情況是默認的情況。如果您沒有它並且沒有其他情況匹配,則該函數將返回空值。

Office website有關於此的文檔,但它們的示例語法是VBA,它也是錯誤的。我已經向他們提供了這方面的反饋,但是您應該遵循上述示例。

+1

'Switch()'返回分配給匹配的第一個條件的值。因此,如果年齡是40歲,那麼這個表達式會返回1.而不是按照年齡遞減來排序。但我們甚至不知道亞倫是否想要評估多個條件。 – HansUp 2013-02-17 17:05:11

+0

@HansUp - 感謝您的支持! *掌握自己的額頭*是的,我們不知道他是否想要多個案例,但我只是想展示一種通用的語法形式,他可以刪除他不需要的額外案例。 – Yawar 2013-02-17 19:06:03

+0

@Yawar @HansUp感謝球員,我試圖找到一種常見的方式,它適用於大多數數據庫,以比較表達式來生成(計算)新的'布爾列'。實際上,MS Access支持'SELECT'子句中的比較,但對於某些其他數據庫,需要'CASE'子句。在MS Access中,SQL可以是'SELECT AGE> 10 FROM demo',但在其他情況下,它必須是'SELECT(CASE WHEN(AGE> 10)then 1 ELSE 0 END)FROM demo' – Aaron 2013-02-18 01:41:22

0

我不得不使用多個IIF語句來創建一個類似的結果,在訪問SQL。

IIf([refi type] Like "FHA ST*","F",IIf([refi type]="VA IRRL","V")) 

所有剩餘的將保持爲空。