2013-02-17 14 views
13

L'ODBC supporta la clausola CASE WHEN per MS Access? C'è qualche altro database che non supporta la clausola CASE WHEN? Ho provato la seguente query durante la connessione a MS Access con ODBC ma ottengo un'eccezione.MS Access supporta la clausola "CASE WHEN" se si connette con ODBC?

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)'

Sono cercare di trovare un modo comune che funziona per la maggior parte del database per generare (calcolo) il nuovo 'colonne booleane' con un'espressione di confronto, mentre la connessione con ODBC. In realtà, MS Access supporta il confronto nella clausola SELECT, ma per alcuni altri database è necessaria la clausola CASE. Per MS Access, SQL può essere

SELECT AGE > 10 FROM demo

ma in altri devono essere

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

+0

Mi sembra di ricordare che si usava 'IIF' in MS Access invece di' CASE' (non è specifico per ODBC, solo per l'Access generale). –

+0

Sì, ma 'IIF' è specifico per MS Access. Voglio assicurarmi che ODBC supporti 'CASE' per MS Access. – Aaron

+3

Quando si inviano istruzioni utilizzando ODBC, è necessario utilizzare SQL supportato dal database di destinazione. MS Access non supporta le istruzioni CASE, quindi le connessioni ODBC a MS Access non possono "supportarle". –

risposta

9

Si potrebbe utilizzare IIF dichiarazione come nell'esempio seguente:

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

Dal momento che si utilizza Access per comporre la query, è necessario attenersi alla versione di accesso di SQL.

Per scegliere tra diversi valori di ritorno, utilizzare la funzione switch(). Quindi per tradurre ed estendere un po 'il tuo esempio:

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

Il caso' true 'è quello predefinito. Se non ce l'hai e nessuno degli altri casi corrisponde, la funzione restituirà null.

Il Office website ha documentazione su questo, ma la loro sintassi di esempio è VBA ed è anche errata. Ho dato loro un feedback su questo, ma dovresti stare bene seguendo l'esempio precedente.

+1

'Switch()' restituisce il valore assegnato alla prima condizione che corrisponde. Quindi se l'età è 40, quell'espressione tornerà 1. Ordina invece le condizioni per età decrescente. Ma non sappiamo nemmeno se Aaron voglia valutare più di una condizione. – HansUp

+0

@ HansUp - grazie per averlo capito! * schiaffeggiare la propria fronte * E sì, non sappiamo se vuole più casi, ma volevo solo mostrare una forma generale della sintassi e lui può cancellare i casi extra di cui non ha bisogno. – Yawar

+0

@Yawar @HansUp Grazie ragazzi, sto provando a trovare un modo comune che funzioni per la maggior parte del database per generare (calcolare) le nuove 'colonne booleane' con un'espressione di confronto.In realtà, MS Access supporta il confronto nella clausola 'SELECT', ma per alcuni altri casi è necessaria la clausola' CASE'. In MS Access, SQL può essere 'SELECT AGE> 10 FROM demo', ma in altri deve essere' SELECT (CASE WHEN (AGE> 10) THEN 1 ELSE 0 END) FROM demo' – Aaron

0

ho dovuto usare una dichiarazione multipla IIF per creare un risultato simile in ACCESS SQL.

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

Tutti i restanti restano Null.

Problemi correlati