Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】SQLite Scalar function: 3 valued iif and if scalar function

2025年09月13日に「Dev.to」が公開したITニュース「SQLite Scalar function: 3 valued iif and if scalar function」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

SQLite 3.48.0で、`iif`関数が進化し、複数の条件と値をペアで指定できるようになった。これにより、複雑な条件分岐をより簡潔に読みやすく書ける。`if`も追加され、`CASE WHEN`の代わりに簡単に条件分岐を記述できる。

ITニュース解説

SQLiteのバージョン3.48.0において、データベースの機能をより便利にする重要な更新があった。特に注目すべきは、条件分岐を行う関数であるIIF(Immediate Ifの略)の機能強化と、そのエイリアスとしてIFが追加された点だ。この変更により、他のデータベースシステムに慣れている開発者もSQLiteをよりスムーズに利用できるようになり、また、より複雑な条件分岐を簡潔に記述できるようになった。

まず、バージョン3.48より前のIIF関数の使い方を理解しておこう。従来のIIFは、基本的に3つの要素(引数)を受け取る形式だった。一つ目は「条件」、二つ目はその条件が真(true)だった場合に返す「値」、そして三つ目は条件が偽(false)だった場合に返す「値」だ。例えば、「1が0に等しいか?」という条件に対して、真なら「one is zero」、偽なら「one is not zero」と返す場合、iif(1=0, 'one is zero', 'one is not zero')のように記述していた。この例では1と0は等しくないので、結果は「one is not zero」となる。これはプログラミングにおける「もし〜ならば〜、さもなくば〜」という基本的な条件分岐と同じ考え方だ。

しかし、複数の条件を順番にチェックしたい場合、従来のIIFでは少し手間がかかった。例えば、「ある数値が偶数か、3の倍数か、それとも素数か」といった複数のチェックを行うには、IIF関数を入れ子(ネスト)にする必要があった。これは、偽の場合に返す「値」の代わりに、さらに別のIIF関数を指定するという方法だ。具体的には、iif(7%2=0, 'even', iif(7%3=0, 'multiple of 3', 'prime'))のように記述する。この式では、まず7が偶数かをチェックし、偽であれば次に7が3の倍数かをチェックし、それも偽であれば「prime」(素数)と判断する。このようにIIFをネストしていくと、条件が増えるにつれてコードの可読性が低下し、括弧の数が増えて間違いも発生しやすくなるという問題があった。特にうるう年の判定のような、複数の複雑な条件を段階的にチェックする場合には、コードが非常に読みにくく、記述も困難になることが多かった。

最新のバージョン3.48以降では、この問題が大きく改善された。新しいIIF、またはそのエイリアスであるIF関数は、まるでCASE WHEN THEN文のように、条件と値をペアで複数指定できるようになったのだ。これにより、先述のうるう年判定の例も、iif(2025 % 400 = 0, 'leap', 2025 % 100 = 0, 'not leap', 2025 % 4 = 0, 'leap', 'not leap')のように、より平坦で読みやすい形式で書けるようになった。これは、まるで複数の「もし〜ならば〜」を順番に指定できるようになったようなもので、コードが格段に整理され、理解しやすくなる。しかも、この新しい機能は従来のIIFの振る舞いを維持しつつ追加されており、以前のコードが動かなくなるという心配がない。後方互換性を保ちながら機能を拡張することは、非常に高度な技術と設計が求められることだ。

新しいIIF/IF関数は、大きく分けて3つの表現形式を持つ。

一つ目は「3値表現」だ。これはバージョン3.48以前のIIFと全く同じで、最も基本的な形式だ。条件、真の場合の値、偽の場合の値をそれぞれ一つずつ指定する。例えば、iif(2025%4=0, 'probably leap', 'not leap')のように書く。2025は4で割り切れないため、結果は「not leap」となる。

二つ目は「2値表現」だ。これは、条件と真の場合の値の二つだけを指定する形式だ。この場合、もし条件が偽と評価されたとしても、偽の場合に返す値を明示的に指定していないため、NULL(何も値がないこと)が返される。例えば、iif(2025%4=0, 'probably leap')のように書くと、2025が4で割り切れないため、結果はNULLとなる。この形式は、条件が真の場合にのみ特定のアクションをしたいが、偽の場合は特に何も返さなくて良い、という場合に便利だ。ただし、最低でも条件と真の値の二つの引数が必要であることに注意が必要だ。

三つ目は「Nペア表現」だ。これが最も強力で柔軟な新しい機能だ。複数の「条件と値のペア」を順番に指定できる。例えば、iif(2025 % 400 = 0, 'leap', 2025 % 100 = 0, 'not leap', 2025 % 4 = 0, 'leap', 'not leap')のように、条件、その条件が真の場合の値、次の条件、その条件が真の場合の値、…と続けて記述できる。この形式では、関数に渡す引数の総数によって、最後の挙動が少し変わる点がある。もし引数の総数が「偶数」の場合、全ての条件が偽だった場合にはNULLが返される。一方、引数の総数が「奇数」の場合(つまり、最後の引数が単独の値として存在する場合)、全ての条件が偽だった場合には、その最後の引数に指定された値が返される。この最後の単独の引数は、全ての条件に合致しなかった場合の「デフォルト値」として機能するわけだ。これにより、CASE WHEN THEN ELSEELSE句のような役割をIIF関数で実現できる。先ほどのうるう年の例では、最後の引数「'not leap'」がデフォルト値として機能しているため、結果は「not leap」となる。

これらの新しい機能により、IIFIF関数は、複数の条件に基づいて異なる結果を返す必要がある場面で、CASE WHEN THEN文と同様の、あるいはそれ以上に簡潔で読みやすい記述方法を提供してくれるようになった。特に、条件と値のペアを複数指定できる「Nペア表現」は、コードの複雑さを軽減し、開発者が意図する条件分岐を直感的に表現できるようになる点で、非常に大きな進歩と言えるだろう。システムエンジニアを目指す上で、このようなデータベース関数の進化を理解し、適切に使いこなすことは、効率的で保守しやすいシステムを構築するために不可欠なスキルとなるだろう。

関連コンテンツ