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 プロジェクトにおけるトランジション コンポーネントの適用の概要

推薦する

vue3 コンポーネント通信方法の概要と例

vue3コンポーネントの通信モードは次のとおりです。小道具$放出$expose / 参照$属性vモデ...

MySQL ビューの紹介と基本操作のチュートリアル

序文ビューは、データベース システム内で非常に便利なデータベース オブジェクトです。 MySQL 5...

MacOS Catalina アップグレード後の VMware ブラック スクリーン問題に対する完璧な解決策の詳細な説明

MacOS Catalina アップグレード後の VMware ブラック スクリーンに対する完璧なソ...

Vueモバイル端末に最適な適応ソリューションについての簡単な説明

序文: 最近の医療モバイル プロジェクトに基づいて、Vue はさまざまな画面のさまざまな画面サイズに...

MySQL でのストアド プロシージャと関数の作成の詳細な説明

目次1. ストアドプロシージャ1.1. 基本構文1.2 実行権限を指定してストアドプロシージャを作成...

ボタンをクリックしてテキストを入力ボックスに変換し、保存をクリックしてテキスト実装コードに変換します。

ボタンをクリックしてテキストを入力ボックスに変換し、保存をクリックしてテキスト実装コードに変換します...

WeChat アプレット uniapp は左スワイプによる削除効果を実現します (完全なコード)

WeChatアプレットuniappは左スワイプで削除効果を実現成果を達成する1. スワイプしてリス...

Vue検証コードコンポーネントの使い方の詳しい説明

この記事の例では、vue検証コードコンポーネントで使用される具体的な実装コードを参考までに共有してい...

ホバー生成の境界線によって生じる要素の移動を解決する方法

序文hover疑似クラスが要素に境界線を追加すると、要素内のコンテンツがずれることがあります。box...

よく使われるCSSカプセル化方法の概要

1. pc-reset PCスタイルの初期化 /* 正規化.css */ html{ 行の高さ: 1...

MySQL sql_modeの適切な設定に関する詳細な説明

MySQL sql_modeの適切な設定sql_mode は見落とされやすい変数です。デフォルト値は...

SQLで同じフィールドの異なる値のデータ統計を実行する

適用シナリオ: シールのさまざまな状態に応じて、さまざまな状態のシールの数をカウントする必要がありま...

ウェブページの表の分割線を削除する方法

<br />Web テーブルの分割線を削除する方法。実際、上記の 3 つの表はいずれも ...

Vueバインディングオブジェクトと配列変数を変更した後にレンダリングできない問題の解決策

プロジェクトシナリオ:ページ表示には <ul> タグがあります。リストデータを動的に表示...

5つのクールで実用的なHTMLタグと属性の紹介

実はこれもクリックベイトのタイトルであり、「派手」とは言えません。ただ私が無知で、こうしたラベルを見...