Microsoft Accessはリレーショナルデータベースなので、SQLクエリを実行できます。
SQLの条件分岐でよく使うCASE式(CASE~WHEN~THEN~END)は、Oracle・PostgreSQL・MySQL・SQL Serverなど主要なRDBMSでは使用できます。
しかし、Accessでは使用できません。
AccessでCASE式と同じような条件分岐をしたい場合は、Switch関数を使用すればできます。
なお、今回のバージョンは以下の通りです。
- Access バージョン1909(Microsoft Office 365 ProPlus)
Switch関数の構文と使い方
Switch関数の構文はこちらです。
条件式と条件式が真(TRUE)の時に返す値をカンマ区切りで繋げていきます。
【構文】 Switch(expression-1, value-1 [, expression-2, value-2] …)
SELECT文で使うことが多いので、サンプルで以下のようなテーブルを用意しました。
sei | mei | score |
---|---|---|
佐藤 | 一郎 | 95 |
鈴木 | 二郎 | 71 |
田中 | 三郎 | 80 |
高橋 | 四郎 | 56 |
山田 | 五郎 | 62 |
以下のように、点数(score)の範囲によって成績(grade)を割り当てます。
- 90点以上 … A
- 80~89点 … B
- 70~79点 … C
- 60~69点 … D
- 59点以下 … E
Switch関数を使ったSQLはこのようになります。
点数の条件式とその条件に当てはまる成績を並べています。
SELECT
sei
,mei
,score
,SWITCH(
score >= 90, 'A'
,score >= 80 AND score <= 89, 'B'
,score >= 70 AND score <= 79, 'C'
,score >= 60 AND score <= 69, 'D'
,score <= 59, 'E'
) AS grade
FROM
student;
結果はこちらです。
sei | mei | score | grade |
---|---|---|---|
佐藤 | 一郎 | 95 | A |
鈴木 | 二郎 | 71 | C |
田中 | 三郎 | 80 | B |
高橋 | 四郎 | 56 | E |
山田 | 五郎 | 62 | D |
ちなみに、gradeという別名を付けていますが、この項目で並び替えやグループ化する場合は、以下のようにGROUP BY句やORDER BY句に全文を記述しないといけません。
SELECT
sei
,mei
,score
,SWITCH(
score >= 90, 'A'
,score >= 80 AND score <= 89, 'B'
,score >= 70 AND score <= 79, 'C'
,score >= 60 AND score <= 69, 'D'
,score <= 59, 'E'
) AS grade
FROM
student
ORDER BY
SWITCH(
score >= 90, 'A'
,score >= 80 AND score <= 89, 'B'
,score >= 70 AND score <= 79, 'C'
,score >= 60 AND score <= 69, 'D'
,score <= 59, 'E'
);
このサンプルではあまり意味のない並び替えですが。
なお、この記述はAccessの場合ですが、RDBMSによって微妙に異なります。
IIF関数でも可能だが入れ子が複雑になる
Access・SQL Serverでは、Switch関数以外にもIIF関数という似たようなものがあります。
こちらでも上記のSwitch関数のような条件分岐は可能ですが、条件が複数の場合は入れ子が複雑になるので、あまりおすすめはしません。
IIF関数の構文はこちらです。
条件式と条件式が真(TRUE)の時に返す値、偽(FALSE)の時に返す値を一文で記述できます。
【構文】 IIF(expression, true_value, false_value)
IIF関数を使ったSQLはこのようになります。
SELECT
sei
,mei
,score
,IIF(score >= 90, 'A', IIF(score >= 80 AND score <= 89, 'B', IIF(score >= 70 AND score <= 79, 'C', IIF(score >= 60 AND score <= 69, 'D', IIF(score <= 59, 'E'))))) AS grade
FROM
student;
入れ子が多いので分かりにくさ半端ないです。。
最後に
今回は、Microsoft AccessのSQL条件分岐で使うSwitch関数を紹介しました。
Accessの場合は、他のRDBMSでは使えるCASE式が使えませんので、Switch関数で対応しましょう。
コメント