2012-01-03 12 views
16

SQL文でカラムがNOT NULLであるかどうかをチェックする必要があります。カラムがNOT NULLであるかチェックしてください。

私のSQLクエリ:

select column_a, column_b, column_c, column_d, column_x 
from myTable 

私は私の選択の列をたくさんしました。私は次の操作を行いたい場合だから私は、パフォーマンスの問題を持っている:

select column_a, column_b, column_c, column_d, column_x 
from myTable 
where column_a is not null or column_b is not null or column_c is not null 
or column_x is not null 

はNULLされていない任意の列があるかどうかを確認するために、別の(より良い)方法はありますか?

+1

なぜパフォーマンスの問題ですか?これらの列の値のほとんどは実際にはNULLなので、不要な行をスキャンしていますか?この結論にどうやって来ましたか? –

+0

最初にNULLの量が最も少ない列を配置できますか?すべての列のインデックスはどうですか? –

+0

いずれかの列にNULL値があるかどうか(質問タイトルと質問本体に記載されているように)、またはNULLでない列があるかどうかを知りたいですか? 2つの全く異なる質問。 – RedFilter

答えて

22

これにはCOALESCEを使用できます。 COALESCEは、もしあれば最初の非ヌル値を返します。これはおそらくそれほどうまく機能しませんが、はるかに読みやすくなります。

例:

where coalesce(column_a, column_b, column_c, column_x) is not null 

あなたのデータのカーディナリティによっては、パフォーマンスを助けるためにインデックスを追加することができるかもしれません。

また、4つの列がすべてNULLかどうかを示す永続的な計算列を使用することもできます。

+1

あなたは*できますが、nullの結果がすべてであることを除いて、どの列がNULLであるかわかりません。 OPがすべての列がヌルであることを確認したい場合、COALESCEはうまくいくでしょう。ただし、* any *列がnullであるかどうかを検出するための簡潔な方法ではありません。 –

+3

@ブラッド:OPは、カラムが** not ** nullであるところを選択しています。 'COALESCE'はこれに対して完全に機能し、元のクエリより多くの情報を提供します。 – RedFilter

+1

私は「これらの列のいずれかがヌルであるかどうかをどのように検出するか」という質問を理解しています。 COALESCEは、単一の列がNULLの場合、少なくとも1つがNULLでないか、またはすべてがNULLであるかどうかを伝えません。だから、最初の列がnullでない限り、あなたは実際に次の3つのテストを無視しています。 (同様に、最初の2つは前の2つと比較され、以下同様)。たぶん私はその質問を誤解しているのかもしれない。 –

2

これを攻撃する1つの方法は、値があるかどうかを追跡する追加のビット列を追加することです。

賛否あなたは

  • はその列のインデックスを作成することができ
  • 他の列をスキャンする必要はありませんあなたのコードの残りの部分を変更する必要はありませんので、

    • がトリガで実装することができます

    短所

    • あなたのデータは非正規化されるだろう
    • より複雑な/よりメンテナンス
    • 賛否は両論があなたを打つどのくらいの性能の依存上回るかどうか、追加の列

    のためのより多くのストレージスペース他の列を見て撮影しています。コミットする前にプロファイルしてください!

  • +0

    索引は、大部分の場合、すべての列がNULLになっているような異常な状況でなければ、検索のコストのために 'column_a、column_b、column_c、column_d、column_x'をカバーしない限り、おそらく使用されません。フィルタリングされたインデックスまたはインデックス付きビューを 'NOT NULL'基準で直接使用することもできます。 –

    +0

    こんにちはRQDQ、あなたの答えをありがとう。私は、それが大きなオーバーヘッドだと仮定します。もし私がこの値のために別の列を作っていれば、おそらく、温度の高いテーブルを持つSQLクエリで? – bitsmuggler

    2

    私は一般的に@ RedFilterのCOALESCEの提案が好きですが、別の解決策はCHECKSUM()関数を使用することです。もちろん、すべてのNULLのチェックサムの値は列とデータ型によって異なります。そのため、最初にクエリを実行してその値を取得する必要があります。ような何か:

    select column_a, column_b, column_c, column_d, column_x 
    from myTable 
    where CHECKSUM(*) <> {All_NULL_Value_obtained_above} 
    

    私は、これはCOALESCEのアイデアよりも良くも悪くも実行しますが、試してみる価値があるかもしれないかどうかわからないです:

    select CHECKSUM(*) AS [All_NULL_Value] 
    from myTable 
    where column_a is null 
    AND column_b is null 
    AND column_c is null 
    AND column_d is null 
    AND column_x is null 
    

    次に、あなたがこれを行うことができます。

    0

    回答5年前、しかし、ブラッドと言って、質問のタイトル合体は間違ったアプローチです。場合によっては、実際にパラメータがnullであるかどうかを確認する必要がある場合は、次のようにしてください:

    where convert(binary, column_a) + convert(binary, column_b) + convert(binary, column_c), + convert(binary, column_k) is null 
    
    +0

    "合体が間違ったアプローチです"なぜですか? –

    関連する問題