sql >> データベース >  >> RDS >> Sqlserver

SQLServerでのNULLの処理

    NULLとは何ですか? NULLまたはNULLマーカーは、SQLで不明な値を表す方法です。SQLでは、MSSQLServerではなく標準の構造化照会言語を参照しています。最後の文は、標準がE.F.コッド博士によって最初に定義された1969年に少し遡ります。いわゆる3値述語論理の観点から考える必要があるため、NULLが必要になります。述語は、保持するか保持しないかのいずれかの式のプロパティです。額面通りに、2つの可能性を考えるでしょう:TRUEまたはFALSE。ただし、3番目の可能性があります:不明。

    例を見てみましょう。関係(表)の属性(列)が、ガーナのアクラにある一連の中小企業所有者の納税者番号(TIN)を表すと仮定します。各事業主のレコードの列には、TINが入力されます。この列を使用して、納税の最新情報など、他の属性を判断できます。ただし、このユースケースには2つの追加の可能性があります。

    1. ビジネスオーナーはTINを持っており、最新の状態です。
    2. ビジネスオーナーはTINを持っておらず、(明らかに)最新ではありません。

    上記は、コッド博士が4値述語論理と呼んだものを説明しています。ただし、SQL標準は、不明、つまりNULLとして定義することにより、これら2つの追加条件を単純化します。事業主のTINは不明であり、影響を受ける事業主の属性から他の値を決定することはできません。したがって、NULLは不明であり、標準の3値述語論理の3番目の値です。

    NULLは特別です

    NULLの定義では、実際の値とは異なる方法でマーカーを処理する必要があります。次に例を示します。

    1. フィルター「WHERE=NULL;」のようなものはありません。正しい式は「WHEREISNULL;」です。逆の表現についても同じことが言えます。
    2. SQLの昇順でソートする場合、NULLを最初ま​​たは最後にリストすることを選択できます。デフォルトでは、最初にNULLをリストします。
    3. NULL値を比較することはできません。 NULLは不明であると述べたので、これは明らかなはずです。
    4. 連結の試行にNULL列が含まれる場合、結果はNULLになります。

    一般的なNULL関連の関数

    以下は、SQLServerの3つの一般的なNULL関連関数です

    ISNULL

    ISNULL –NULLを指定された置換値に置き換えます。リスト1と図1は、ISNULLの簡単な例を示しています。

    -- Listing 1: Simple Example of ISSNULL
    SELECT ISNULL (NULL, 3) NULLREPLACEMENT;
    SELECT ISNULL (NULL,'GREEN') NULLREPLACEMENT;
    SELECT ISNULL (NULL,'2018-12-25') NULLREPLACEMENT;
    の簡単な例

    図1:ISNULLの簡単な例

    NULLIF

    NULLIFは、2つの引数の値が等しいNULLを返します。

    -- Listing 2: Simple Example of NULLIF
    SELECT NULLIF(3,3) AS NULLIFF;
    SELECT NULLIF(3,5) AS NULLIFF;
    SELECT NULLIF('RED','RED') AS NULLIFF;
    SELECT NULLIF('GREEN','RED') AS NULLIFF;

    図2:NULLIFの簡単な例

    COALESCE

    COALESCEは、提供されたリストから最初のNULL以外の値を返します。リスト1にこの例を示し、図1にクエリの出力を示します。

    -- Listing 3: Simple Example of COALESCE
    SELECT COALESCE (NULL,'','GREEN','','') AS NULLRESPONSE;
    SELECT COALESCE (NULL,'GREEN','HOPE','') AS NULLRESPONSE;
    SELECT COALESCE (1,'','GREEN','','') AS NULLRESPONSE;

    図3:合体の簡単な例

    これらの単純な例は、NULLの性質を使用するために公開されていることに注意してください。 NULLと空白スペースは同じではありません。最初のステートメントで、COALESCEは空白スペースを返し、空白スペースがリストの最初の非NULL値であることを示します。

    ISNULLとCOALESCEの違い

    ISNULLとCOALESCEの違いは、参考文献のセクションにリストされているような本だけでなく、いくつかのオンライン記事の主題となっています。これらの違いは次のように要約されます。

    1. ISNULLはSQLServer独自のものですが、COALESCEはANSI標準関数です。これは、移植性のためにCOALESCEが優先されることを意味します。
    2. ISNULLは2つの引数のみを取りますが、COALESCEは3つ以上の引数を取ります。
    3. ISNULLによって返される値のデータ型は、最初の引数のデータ型によって決定されますが、COALESCEによって返される値のデータ型は、リスト内で最も優先度の高いデータ型によって決定されます。
    4. 両方の関数をサブクエリで使用すると、COALESCEが内部でCASE式に変換され、スキャンが繰り返される傾向があるため、ISNULLのパフォーマンスが向上します。

    Itzik Ben-Ganは、この記事の最後にリンクが記載されている彼の記事で、COALESCEをケース表現に変換することのその他の影響についても調査しています。

    サンプルのユースケース

    リスト4で作成しているテーブルの特定の基準に基づいて、Webポータルに顧客のリストを表示したいと思います。タスク1と2は可能な要件を示し、要件を満たすためにISNULLとCOALESCEを使用します。

    --Listing 4: Table Creation Script
    CREATE TABLE CUSTOMER 
    (ID INT IDENTITY (1,1)
    ,FIRSTNAME VARCHAR(50)
    ,LASTNAME VARCHAR(50)
    ,SEX CHAR(1)
    ,ADDRESS VARCHAR(300)
    ,FIRSTTRANDATE DATETIME
    ,PHONENUMBER1 BIGINT
    ,PHONENUMBER2 BIGINT
    ,PHONENUMBER3 BIGINT);
    GO
    
    INSERT INTO CUSTOMER VALUES ('KENNETH','IGIRI','M','ACCRA, GHANA',GETDATE(),'0245335678','0555335678',NULL);
    INSERT INTO CUSTOMER VALUES ('RICHARD','HANO','M','BUDAPEST, HUNGARY',GETDATE(),'889189400122',NULL,NULL);
    INSERT INTO CUSTOMER VALUES ('GEORGINA','APPIAH','F','ACCRA, GHANA','09-16-2018','02456665678','0275339678',NULL);
    INSERT INTO CUSTOMER VALUES ('HOWARD','KLEVIA',NULL,'HAGUE, SWITZERLAND','02-16-2017','3499285782',NULL,NULL);
    INSERT INTO CUSTOMER VALUES ('ZEN','GREGOR',NULL,'SHANGHAI, CHINA','06-23-2018','0245335678','0555335678',NULL);
    INSERT INTO CUSTOMER VALUES ('IHEOMA','AWA','F','LAGOS, NIGERIA',GETDATE(),'0245335678','0555335678',NULL);

    図4サンプルテーブル

    タスク1 :代替電話番号を提供しなかったすべての顧客のリストを返します。

    --Listing 5: Table List of Customers with no Secondary Phones
    --A: The Simple Answer
    SELECT * FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;
    
    --B: Presenting the Result Set Better
    SELECT 
    FIRSTNAME
    ,LASTNAME
    ,ADDRESS
    ,FIRSTTRANDATE
    ,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
    ,ISNULL(CAST(PHONENUMBER2 AS VARCHAR), 'NO SECONDARY PHONE') AS [SECONDARY PHONE NUMBER]
    FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;

    COALESCE(またはISNULL)を使用すると、「セカンダリ電話なし」というテキストを使用して、必要な情報をより適切に提示できます。

    図5リスト5の結果セット

    タスク2 :すべての顧客のリストとその主要な電話番号を返します。 およびその他の代替電話番号。

    --Listing 6: Table List of Customers with an Other Alternate Number
    SELECT 
    FIRSTNAME
    ,LASTNAME
    ,ADDRESS
    ,FIRSTTRANDATE
    ,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
    ,COALESCE(CAST(PHONENUMBER2 AS VARCHAR),CAST(PHONENUMBER3 AS VARCHAR), 'NO OTHER PHONE') AS [OTHER PHONE NUMBER]
    FROM CUSTOMER  ;

    図6リスト6の結果セット

    この場合、3つの引数を渡すため、ISNULLはオプションではありません。

    結論

    この記事では、3値述語ロジックに関連するNULLの概念について説明し、SQLServerでNULLを含むデータセットを処理するために使用する一般的な関数について説明しました。これらの関数の使用方法の例も見てきました。他の多くの参考資料では、これらの関数の使用法、利点、および制限について詳しく説明しています。良い情報源として、ItzikBen-Ganの本やブログを強くお勧めします。

    参照

    • NULLIF(Transact-SQL)
    • COALESCE(Transact-SQL)
    • ItzikBen-Ganの記事

    1. SQL Server:すべての大文字を適切なケース/タイトルケースにする

    2. PostgreSQL範囲タイプでのNULLと`無限大`

    3. MySQLの自動インクリメント列が10ジャンプするのはなぜですか?

    4. Accessでデータベース図を作成する方法