システム移行時に注意! 各DBのNULLの取り扱いまとめ

こんにちは。池島です。
 
システム開発に欠かせないデータベースですが、各データベースにはデータの取り扱いに差異があります。今回は各データベースにおけるNULLと空文字の取り扱いについてご紹介します。

今回の検証環境

以下4つのデータベースについて比較していきます。

PostgreSQL
15.1
Oracle
19c
MySQL
8.0.31
SQL Server
2017

検証内容

次のようなテーブル:employeeを作成します。

name(varchar) position(varchar)
ikejima (null)
yamada
saitou chief

下記SQLを各データベースで実行し、結果を確認します。
 
・IS NULLで判定

SELECT *
FROM employee
WHERE position IS NULL;

・空文字と等号で判定
SELECT *
FROM employee
WHERE position = '';

PostgreSQL

・IS NULLで判定

name(varchar) position(varchar)
ikejima (null)

・空文字と等号で判定

name(varchar) position(varchar)
yamada

IS NULL判定では、positionがNullのデータが取得でき、空文字と等号の判定では、positionが空文字のデータが取得されていることが分かります。

Oracle

・IS NULLで判定

name(varchar) position(varchar)
ikejima (null)
yamada

・空文字と等号で判定

name(varchar) position(varchar)
取得結果なし

IS NULL判定では、positionがNullのデータと、空文字のデータが取得されました。空文字と等号の判定では、データは取得できませんでした。Oracleでは空文字がNULLとして取り扱われていることが分かります。

MySQL

・IS NULLで判定

name(varchar) position(varchar)
ikejima (null)

・空文字と等号で判定

name(varchar) position(varchar)
yamada

PostgreSQLと同じ結果となりました。

SQL Server

・IS NULLで判定

name(varchar) position(varchar)
ikejima (null)

・空文字と等号で判定

name(varchar) position(varchar)
yamada

PostgreSQLとMySQLと同じ結果になりました。

検証結果

結果をまとめると下記の通りになりました。

PostgreSQL
NULLと空文字を区別する
OracleL
空文字はNULLとして判別される
MySQL
NULLと空文字を区別する
SQL Server
NULLと空文字を区別する

まとめ

いかがでしたでしょうか。
 
データベースによって仕様差異があることは、頭の片隅にあると役に立つことがあるかと思います。特にシステム移行やマイグレーションの際には注意したいですね。ではまた!
 
 
 
 
《関連記事》

UNIONを使ってみた
技術
2022.7.20(Wed)

PostgreSQLで検索結果を結合する! UNIONを使ってみた

#まとめ

GENERATE_SERIES関数を使ってみた
技術
2022.10.14(Fri)

PostgreSQLで連番を作るGENERATE_SERIES関数を使ってみた

#SQL

PostgreSQLで抽出データにコメントを付ける
技術
2022.12.13(Tue)

【PostgreSQL】抽出するデータにCASE式でコメントを付けてみた

#SQL

記事をシェア
MOST VIEWED ARTICLES