MySQLでNULL値を判定する際の落とし穴事例

MySQLでNULL値を判定する際の落とし穴事例

序文

今日、プログラムを開発しているときに、case when 構文を使用して MySQL からデータを抽出し、判断しました。使用中に、NULL 値の判断時に小さな問題が発生しました。

MySQL の when 文は Java の switch 文に似ており、より柔軟ですが、MySQL での Null の処理は少し特殊です。

Mysql の case when 構文:

構文1:

CASE ケース値
    WHEN when_value THEN ステートメントリスト
    [WHEN when_value THEN statement_list] ...
    [ELSE ステートメントリスト]
終了ケース

構文2:

場合
    WHEN 検索条件 THEN ステートメントリスト
    [WHEN 検索条件 THEN ステートメント リスト] ...
    [ELSE ステートメントリスト]
終了ケース

注: これら 2 つの構文には違いがあり、その違いは次のとおりです。

1: 最初の構文: case_value は、userid%2=1 や username is null などの式である必要があります。この構文は NULL のテストには使用できません。

2: 2 番目の構文 CASE には変数や式は必要ありません。直接実行すると、各 WHEN の後の条件が評価され、条件が満たされた場合に実行されます。

事例実践:

テーブル構造は次のようになります: aの値はnull、bの値は1です

mysql> SELECT NULL AS a, 1 AS b;
+------+---+
| ア | ロ |
+------+---+
| NULL | 1 |
+------+---+

ここで、aの値がnullの場合はbの値を取得し、そうでない場合はaの値を取得するように実装します。

方法1: ifnullの使用

選択
    IFNULL(a, b) 新規、
    、
    b
から
    -- 一時テーブルを作成します。a の値は null、b の値は 1 です。
    (NULL を a として、1 を b として選択) tmp;

方法2: 使用する場合

選択
    (
        場合
        aがNULLの場合
            b
        それ以外
            1つの
        終わり
    ) 新品同様、
    、
    b
から
    (NULL を a として、1 を b として選択) tmp;

結果が間違っていることがわかりました。new の値は、期待どおり 1 ではなく null でした。

このエラーはなぜ発生するのでしょうか?これは、最初の構文と 2 番目の構文が混在していることが原因です。case 後の Commission_pct には、実数値または null の 2 つの値があり、commission_pct が null の場合も true または false の 2 つの値があります。したがって、case 後の値が null の場合、true または false と一致することはなく、出力は null ではありません。

この場合に構文 1 を使用する必要がある場合は、次のように書き直すことができます。

選択
    (
        ケースaはNULLです
        TRUEの場合、b
        それ以外         
        終わり
    ) 新品同様、
    、
    b
から
    (NULL を a として、1 を b として選択) tmp;

構文 2 を使用して次のように記述することもできます。

選択
    (
        場合
        aがNULLの場合、b 
        それ以外 
        終わり
    ) 新品同様、
    、
    b
から
    (NULL を a として、1 を b として選択) tmp;

エラーが存在する可能性があるが、見つけるのが容易ではない別のケースに注意してください。

選択
    (
        場合
        NULLの場合はb
        それ以外         
        終わり
    ) 新品同様、
    、
    b
から
    (NULL を a として、1 を b として選択) tmp;

問題ないように見えますが、実は問題があります。問題の原因は、= を使って null を判定できないことです。簡単に言うと、構文 1 の case 式の値は = を使用した場合に後続の値と比較されますが、MySQL では is または is not を使用する必要があります。

要約:

1: 構文 1 は、case の後の式の値を計算し、次に「=」を使用して when 条件の値が等しいかどうかを判断します。等しい場合は、分岐に入ります。

2: 構文 2 では、case の後に式は必要ありません。when の後に条件値を直接評価できます。true の場合は、入力します。

これで、MySQL で NULL 値を判断する場合に関するこの記事は終了です。MySQL で NULL 値を判断する場合に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL CASE WHEN ステートメントの使用手順
  • MySQLのCASE WHEN文の使用例をいくつか紹介します。
  • MySQL で case when 文を使用して複数条件クエリを実装する方法
  • MySQLソートにおけるCASE WHENの使用例

<<:  よく使われるn番目の子セレクターをまとめる

>>:  Vue プロジェクトにおけるトランジション コンポーネントの適用の概要

推薦する

Vueはルールを使用してフォームフィールドの検証を実装します

Vue でフォーム フィールドを記述および検証する方法は多数あります。このブログでは、より一般的に使...

JavaScriptのループの違いについての詳細な説明

目次序文列挙可能なプロパティ反復可能なオブジェクトforEachメソッドとmapメソッドチェーン呼び...

MySQLはinet_atonとinet_ntoaを使用してIPアドレスデータを処理します。

この記事では、適切な形式を使用して IP アドレス データをデータベースに保存し、IP アドレスを簡...

独自のネイティブ JavaScript ルーターを作成する方法

目次序文導入JavaScript 履歴 API独自のネイティブJSルーティングを実装するHistor...

Linuxコマンドに基づいてフォルダー内の特定のファイルパスを抽出します

最近では、特定のフォルダ内の特定のファイルを自動的に検索する必要があり、ファイルパスとファイル名を別...

CSS 配置レイアウト (位置、配置レイアウト スキル)

1. ポジショニングとは何ですか? CSS の position 属性には、absolute/re...

スタイルをより標準化するための CSS の書き方に関する 5 つのヒント

1. CSSをアルファベット順に並べるアルファベット順ではありません:コードをコピーコードは次のとお...

デジタル時計効果を実現するJavaScript

この記事の例では、JavaScriptでデジタル時計効果を実装するための具体的なコードを参考までに共...

MySQL と Golan 間の従来の分散トランザクションのための 7 つのソリューション

目次1. 基本理論1.1 取引1.2 分散トランザクション2. 分散トランザクションソリューション2...

MySQL バックアップ スクリプトの書き方

序文:データベースのバックアップの重要性は、特にデータの損失が深刻な結果を招く可能性がある実稼働環境...

mysql8でルートユーザーのパスワードをリセットする手順を完了します

序文最近、多くの新しい同僚がこの質問をしてきました。特に、homebrew を通じて自動的にインスト...

Centos7 に mysql と mysqlclient をインストールする際に遭遇する落とし穴の概要

1. MySQL Yumリポジトリを追加するMySQL公式サイト>ダウンロード>MySQ...

Linux環境でユーザーにsudo権限を追加する方法

sudo 設定ファイルsudo のデフォルトの設定ファイルは /etc/sudoers です。一般的...

小さな画像をクリックしたときに更新せずに大きな画像コードが表示されるようにLightboxを実現するためにCSSを使用する

小さな画像をクリックしたときに更新せずに大きな画像コードが表示されるようにLightboxを実現する...

nginx での書き換えジャンプの実装

1. 新旧ドメイン名のジャンプ適用シナリオ: ドメイン名ベースのリダイレクト。会社の古いドメイン名は...