Does MS Access support "CASE WHEN" clause if connect with ODBC?
Asked Answered
K

3

17

Does ODBC support CASE WHEN clause for MS Access? Is there any other database which does not support the CASE WHEN clause? I tried the following query while connecting to MS Access with ODBC but get an exception.

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

I'm try to find a common way which works for most of the database to generate (compute) the new 'boolean columns' with an comparison expression while connect with ODBC. Actually, MS Access support the comparison in SELECT clause, but for some other databases CASE clause are needed. For MS Access, the SQL can be

SELECT AGE > 10 FROM demo

but in others it have to be

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

Kuchen answered 17/2, 2013 at 10:27 Comment(5)
I seem to recall that you had use IIF in MS Access instead of CASE (that's not specific to ODBC, just the general Access thing).Fovea
Yes, but IIF is MS Access specific. I want to make sure whether ODBC support CASE for MS Access.Kuchen
When sending statements using ODBC you must use SQL that is supported by the target database. MS Access doesn't support CASE statements, so ODBC connections to MS Access cannot "support" them either.Atheling
@LordPeter I doubt if the OP will get a better answer. ( How is Harriet Vane these days? )Unsaddle
@Remou My origins are humble, but they are charming stories :)Atheling
B
16

You could use IIF statement like in the next example:

SELECT
   IIF(test_expression, value_if_true, value_if_false) AS FIELD_NAME
FROM
   TABLE_NAME
Baseline answered 22/5, 2013 at 12:26 Comment(0)
D
34

Since you are using Access to compose the query, you have to stick to Access's version of SQL.

To choose between several different return values, use the switch() function. So to translate and extend your example a bit:

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

The 'true' case is the default one. If you don't have it and none of the other cases match, the function will return null.

The Office website has documentation on this but their example syntax is VBA and it's also wrong. I've given them feedback on this but you should be fine following the above example.

Di answered 17/2, 2013 at 16:52 Comment(5)
Switch() returns the value assigned to the first condition which matches. So if age is 40, that expression will return 1. Order the conditions by descending age instead. But we don't even know whether Aaron wants to evaluate more than one condition.Reni
@Reni - thank you for catching that! slapping own forehead And yes, we don't know if he wants multiple cases, but I just wanted to show a general form of the syntax and he can delete the extra cases he doesn't need.Di
@Di @Reni Thanks guys, I'm try to find a common way which works for most of the database to generate (compute) the new 'boolean columns' with an comparison expression. Actually, MS Access support the comparison in SELECT clause, but for some other databases CASE clause are needed. In MS Access, the SQL can be SELECT AGE > 10 FROM demo, but in others it have to be SELECT (CASE WHEN (AGE > 10) THEN 1 ELSE 0 END) FROM demoKuchen
@yawar +1 for the SWITCH. Since you seem to have research on the docs, could you throw some light into a performance comparison between switch and IIF? From whst I encounter IIF slow...Proverb
@Proverb I don't know much about performance characteristics but in my experience switch() is bad at handling comparisons to null. So if you're doing something like switch(something is null, 1, ...) you should instead use iif(something is null, 1, ...).Di
B
16

You could use IIF statement like in the next example:

SELECT
   IIF(test_expression, value_if_true, value_if_false) AS FIELD_NAME
FROM
   TABLE_NAME
Baseline answered 22/5, 2013 at 12:26 Comment(0)
G
1

I have had to use a multiple IIF statement to create a similar result in ACCESS SQL.

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

All remaining will stay Null.

Goulet answered 18/11, 2016 at 22:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.