sql >> データベース >  >> NoSQL >> MongoDB

SQL NULLIF()の説明

    ほとんどの主要なRDBMSは、NULLIF()をサポートしています。 NULLを返す演算子 その引数の両方が同等である場合。引数が同等でない場合は、NULLIF() 最初の引数を返します。

    NULLIF() はSQL標準機能です(ISO / IEC 9075仕様に含まれています)。

    構文

    構文は次のようになります:

    NULLIF (V1, V2)

    これは、次のCASEと同等です。 式:

    CASE WHEN V1=V2 THEN NULL ELSE V1 END

    デモンストレーションの例を次に示します。

    SELECT NULLIF( 12, 12 );

    結果:

    NULL

    この場合、両方の引数は同一であるため、結果はNULLになります。 。

    RDBMSによっては、NULL値の実際の出力が異なる場合があります。たとえば、psql(PostgreSQLの場合)を使用する場合、NULL値が返されるたびにデフォルトで空の文字列が出力されます(ただし、これは変更できます)。 SQLiteでも同じです(これも変更できます)。

    引数が同等でない場合

    引数が同等でない場合は、次のようになります。

    SELECT NULLIF( 12, 13 );

    結果:

    12

    引数が異なるため、最初の引数が返されます。

    文字列

    文字列を比較する例を次に示します。

    SELECT 
        NULLIF( 'Gym', 'Gym' ) AS "Same",
        NULLIF( 'Gym', 'Bag' ) AS "Different";

    結果:

    +------+-----------+
    | Same | Different |
    +------+-----------+
    | NULL | Gym       |
    +------+-----------+

    日付

    日付を比較する例を次に示します。

    SELECT 
        NULLIF( DATE '2045-11-25', DATE '2045-11-25' ) AS "Same",
        NULLIF( DATE '2045-11-25', DATE '1990-08-15' ) AS "Different";

    結果:

    +------+------------+
    | Same | Different  |
    +------+------------+
    | NULL | 2045-11-25 |
    +------+------------+

    表現

    NULLIF() 式の現在の値を評価します。したがって、次のような式を渡すと、次のようになります。

    SELECT NULLIF( 24, 2 * 12 );

    これを取得します:

    NULL

    2に12を掛けたものは24なので、2つの引数は同等です。

    2番目の引数を変更するとどうなりますか:

    SELECT NULLIF( 24, 3 * 12 );

    結果:

    24

    最初の引数が返されます。

    データベースの例

    次のクエリを実行するとします。

    SELECT 
        Name,
        LocalName
    FROM country 
    WHERE Region = 'South America'
    ORDER BY Name;

    結果:

    +------------------+-------------------+
    | Name             | LocalName         |
    +------------------+-------------------+
    | Argentina        | Argentina         |
    | Bolivia          | Bolivia           |
    | Brazil           | Brasil            |
    | Chile            | Chile             |
    | Colombia         | Colombia          |
    | Ecuador          | Ecuador           |
    | Falkland Islands | Falkland Islands  |
    | French Guiana    | Guyane française  |
    | Guyana           | Guyana            |
    | Paraguay         | Paraguay          |
    | Peru             | Perú/Piruw        |
    | Suriname         | Suriname          |
    | Uruguay          | Uruguay           |
    | Venezuela        | Venezuela         |
    +------------------+-------------------+

    ここでは、左側の列に国名があり、右側にそれぞれの国のローカル名があります。

    NULLIF()を追加しましょう クエリの3番目の列へ:

    SELECT
        Name,
        LocalName,
        NULLIF(LocalName, Name) AS "Local Name if Different"
    FROM country 
    WHERE Region = 'South America'
    ORDER BY Name;

    結果:

    +------------------+-------------------+-------------------------+
    | Name             | LocalName         | Local Name if Different |
    +------------------+-------------------+-------------------------+
    | Argentina        | Argentina         | NULL                    |
    | Bolivia          | Bolivia           | NULL                    |
    | Brazil           | Brasil            | Brasil                  |
    | Chile            | Chile             | NULL                    |
    | Colombia         | Colombia          | NULL                    |
    | Ecuador          | Ecuador           | NULL                    |
    | Falkland Islands | Falkland Islands  | NULL                    |
    | French Guiana    | Guyane française  | Guyane française        |
    | Guyana           | Guyana            | NULL                    |
    | Paraguay         | Paraguay          | NULL                    |
    | Peru             | Perú/Piruw        | Perú/Piruw              |
    | Suriname         | Suriname          | NULL                    |
    | Uruguay          | Uruguay           | NULL                    |
    | Venezuela        | Venezuela         | NULL                    |
    +------------------+-------------------+-------------------------+

    3番目の列は、Nameの値と異なる場合にのみローカル名を返すことがわかります。 桁。同じ場合は、NULL 返されます。

    NULLIF()を使用することもできます クエリ結果をフィルタリングするには:

    SELECT 
        Name,
        LocalName
    FROM country 
    WHERE Region = 'South America'
    AND NULLIF(LocalName, Name) IS NOT NULL
    ORDER BY Name;

    結果:

    +---------------+-------------------+
    | Name          | LocalName         |
    +---------------+-------------------+
    | Brazil        | Brasil            |
    | French Guiana | Guyane française  |
    | Peru          | Perú/Piruw        |
    +---------------+-------------------+

    この場合、ローカル名がNameと異なる行のみを返しました。 列。

    NULLIF() vs CASE

    前述のように、次のコード:

    NULLIF (V1, V2)

    次のCASEと同等です 式:

    CASE WHEN V1=V2 THEN NULL ELSE V1 END

    したがって、CASEを使用することが可能です NULLIF()の代わりに式 必要に応じて。 NULLIF() 関数は基本的にCASEの構文上のショートカットです 表現。

    したがって、たとえば、前の例を次のように置き換えることができます。

    SELECT 
        Name,
        LocalName
    FROM country 
    WHERE Region = 'South America'
    AND (CASE WHEN LocalName = Name THEN NULL ELSE LocalName END) IS NOT NULL
    ORDER BY Name;

    結果:

    +---------------+-------------------+
    | Name          | LocalName         |
    +---------------+-------------------+
    | Brazil        | Brasil            |
    | French Guiana | Guyane française  |
    | Peru          | Perú/Piruw        |
    +---------------+-------------------+

    ただし、NULLIF() 関数ははるかに簡潔です。

    パラメータカウントが正しくありません

    間違った数の引数を渡すと、エラーが発生します:

    SELECT NULLIF( 'One' );

    MySQLの結果:

    ERROR 1582 (42000): Incorrect parameter count in the call to native function 'NULLIF'

    1. MongoDB insertMany()

    2. Laravelでジョブをキャンセルする

    3. MongoDBの既存のインデックスを削除せずに変更できますか?

    4. GridFSで(Javaを使用して)更新操作を実行するにはどうすればよいですか?