Navicatブログ

リレーショナルデータベースでの排他的論理和条件の記述 2022年2月11日 Robert Gravelle

効果的なSQLクエリを作成するための重要な要素の1つは、SQL構文を使用して様々な条件を明確に表現する能力です。初心者と経験豊富なデータベース開発者の両方が考えを一時停止する条件の1つは、排他的論理和です。ソフトウェアプログラマーは、排他的論理和条件の構文に精通している傾向があります。これは、ほとんどのプログラミング言語がXOR論理演算子をサポートしているためです。これに対して、多くのデータベースはサポートしていません。

簡単に言うと、排他的論理和条件は通常の論理和に似ていますが、排他的論理和の場合、比較されるオペランドの1つだけが真であり、両方が真ではない点が異なります。このブログでは、XOR演算子をサポートしているかどうかに関係なく、様々なデータベースの排他的論理和条件を表現する方法を学習します。

XOR演算子の使用

MySQLなどの一部の一般的なリレーショナルデータベースはXOR演算子をサポートしているため、排他的論理和条件の記述は非常に簡単です。説明のために、特定の都市内に居住している顧客、または特定の日付以降にアカウントが作成された顧客を見つける必要があるというシナリオを考えてみましょう。両方ではありません。より具体的には、オレゴン州アルバータ州レスブリッジに住む顧客、またはレスブリッジに居住していない場合はアカウントが2020年1月1日以降に作成された顧客を見つけたいとします。

これは、Navicat Premium 16を使用してSakilaサンプルデータベースに対して実行されたまさにそのようなクエリです。

xor_query_1 (191K)

結果を見ると、2020-07-07にアカウントが作成された最初の顧客のstore_idは2であり、残りの顧客は全てstore_idが1(Lethbridge store)であることがわかります。

一方、XORを通常のORに置き換えると、2020-01-01以降にもアカウントが作成されたstore #1で買い物をする顧客が表示されます。

or_query_1 (128K)

両方のオペランドをTRUEと評価できるようにすることが、ORとXORの違いです。

XORがサポートされていない排他的論理和条件の記述

幸い、XOR演算子なしで排他的論理和条件を定式化することはそれほど難しくありません。あなたはそれについてもう少し考える必要があります。数学的に言えば、x XOR yは次のようになります。

(x AND (NOT y)) OR ((NOT x) AND y)

SQLを作成するために、上記の式を次のように簡略化できます。

(A OR B) AND NOT (A AND B)

SQL Serverの最初のクエリを書き直して、この式を試してみましょう。そのデータベースに対して実行しようとすると、次のエラーが発生します。これは、SQL ServerがXOR演算子を認識しなかったことを示しています。

error_msg (27K)

上記の式を使用して、XOR条件を次のように書き直すことができます。

WHERE   (ci.city = 'Lethbridge' OR c.create_date  > '2020-01-01')
AND NOT (ci.city = 'Lethbridge' AND c.create_date > '2020-01-01')

SQL Serverでの結果は次のとおりです(両方のデータベースのデータが同一ではないことに注意してください)。

sql_server (224K)

結論

今日のブログでは、XOR演算子を使用する場合と使用しない場合の両方で、様々なデータベースで排他的論理和条件を明確にする方法を学びました。

Navicat 16を試乗したい場合は、こちら から14日間の試用版をダウンロードできます。

ブログのアーカイブ
シェア