• 締切済み

SQL文で素早くNULLを除外する方法

Select文の結果から、 どこかにNULLを含む場合には除外したいのですが、 表示項目が多い為、「WHERE A IS NOT NULL」 というようにWHERE文を羅列すると、 項目の文だけ記述しなければならず、 結果表示に時間がかかってしまいます。 どなたか効率良くNULLを含む場合は除外する方法を ご存知の方は、ご教授宜しくお願い致します。

みんなの回答

noname#140971
noname#140971
回答No.1

<tab1> ID___kname___address1___address2___dob 1____田中_____東京都______渋谷区_____1960/01/01 2____上村_____東京都______渋谷区_____1970/01/01 3____橘川_____null___________null_________null 4____田中_____東京都______null_________null 5____橘川_____東京都______渋谷区____null (1) SELECT * FROM tab1 WHERE (Address1+Address2) is not null and dob is not null; (2) SELECT * FROM tab1 WHERE Address1 is not null and Address2 is not null and dob is not null; (3) SELECT * FROM tab1 WHERE isnull=0; 検索->表示を1000回繰り返した場合、1=4.85秒、2=5.00秒、3=5.10秒。 なお、bit列を設けた場合、比較する列が1個増えると(3)が(1)(2)との差を0.1秒縮めるようです。 ですから、比較する列数では、空行が存在するか否かの列を追加した方がスッキリする気がします。 もちろん、目的と運用次第でしょうが・・・。

関連するQ&A

  • T-SQL パラメータがNULLの場合条件含めず

    お世話になります。 SQL Server での T-SQLのWhere句のパラメータがNullであった場合に これをWhere句から除外したいのですが・・・ 今まで、こういう場合には、SQL文をプログラム上で作成してそのSQL文を ソースにしてきたのですが、動作速度や汎用性を考えてストアドプロシジャーを使用するのが今後の為と思いこちらで質問させていただきました。 例えば・・・条件のところから WHERE     IF @パラメータ1 Is Not Null         (dbo.TEST.A =< @パラメータ1) AND     IF @パラメータ2 Is Not Null         (dbo.TEST.B =< @パラメータ2) AND このように記述してみたのですが、WHEREが記述された後ではダメなようで・・・次に WHERE     CASE         WHEN @パラメータ1Is Not Null THEN (dbo.TEST.A = @パラメータ1) AND         WHEN @パラメータ2Is Not Null THEN (dbo.TEST.B = @パラメータ2) AND     END 上記にように記述してもやはりエラーが。 WHERE句の後にパラメータを評価し、WHERE句に含めるか、 含めないか記述するにはどうすればいいでしょうか? 初歩的な事かもしれませんが、何卒よろしくお願いいたします。

  • IS NULL

    いつもお世話になっています。 PL/SQLでストアドを作成中なのですが、 あるUPDATE分のWHERE句の条件として“IS NULL”を使用したいのですが、監督者から “IS NULL”はNGという指示が出てしまい困っています。 (理由はNULLは索引の対照外だからということです。) 以前、“IS NOT NULL”の代用として、“項目名 ≧ 0”が使えることを学んだのですが、“IS NULL”にも同じように代用できる条件の記述方法はありますか? “IS NOT NULL”が“項目名 ≧ 0”なら “IS NULL”は“項目名 < 0”というのは無謀でしょうか?

  • is not nullについて

    is not nullについて 質問です。 SQLServer2005を使用しています。 where文である項目に対して「is not null」を使用しているのですが、 いきなり応答時間が遅くなりました。 それまで(約2年間)2秒ぐらいだったのが、10分近くかかるようになりました。 「is not null」を外せば通常に戻るのですが、対象データがある件数(容量)を超える と遅くなるのでしょうか? また、インデックスの再構成→再構築を行うと通常に戻りました。

  • SQL文 NULL値に別の値を表示したい

    以下のようなテーブルAがあったとして、 項目Cを抽出する際、キー項目Bが「2」の場合、nullですが、 これを「b」と表示するようにしたいです。 [テーブルA] キー項目B 項目C ------------ 1  a 2  null 3  c 4  d ---------------------------------------------- 項目Cのデータ型が数値の場合は、 SELECT CASE WHEN B IS NULL THEN 0 ELSE B END AS B FROM テーブルA で対応できるようですが、 文字列の場合は、同じような方法があるのでしょうか? 何かご存じの方、お願い致します。

  • ACCESS:Nullの扱い

    次のようなSQLがあります。 SELECT 住所.住所, 住所.備考 FROM 住所 WHERE (((住所.住所) Not Like "*佐賀県*")); 住所のフィールドにNullがありますが抽出されません。 WHERE (((住所.住所) Not Like "*佐賀県*")) OR (((住所.住所) Is Null)); とすると思い通りの結果になるのですが、なぜNullは「"佐賀県"を含まない」には含まれないのでしょうか。

  • WHEREでヌルをスルーしたい

    いつもお世話になっております。 SQL文のワイルドカードについての質問なのですが、 SELECT 項目1 FROM 表 WHERE 項目1 LIKE '%' というSQLがあったとして、私は項目1のレコードがすべて返されるのかと思いました。 しかしこれだと項目1フィールドにNULLが入っている(何もデータが入っていない)場合、それは除かれてしまうようです。 NULLのレコードも含めてクエリを返してくれるような条件はあるのでしょうか?

  • nullと文字数について

    いつもお世話になっています。 select 項目1 from テーブル where 項目1 is null or length(項目1)>=0 質問1 上記SQLを作成した場合、全レコードが抽出されるのでしょうか? 疑問1 (1)項目1が空白一つの場合、length(項目1)>=0となる? (2)nullと空文字の違いがいまいちわからない。 以上、よろしくお願いします。

  • null→数値にするには?

    何度も質問してすみません。 NULLが格納されているフィールドに 「0」や「1」といった値を入れる為には どういうINSERT INTO文をPHP内で記述すれば宜しいでしょうか? pg_field_is_nullを使ってみたのですが イマイチ値を変更する事ができません。 また、SQL文で「NOT NULL制約」という言葉があるのを知ったのですが、 ALTER TABLE文でテーブルを作る時に、 各フィールドにはnullではなく、「0」を最初から格納したい場合は どういった記述をすれば宜しいでしょうか? 宜しくお願い致します。

  • DB2のSQL

    select * from xTABLE where EMP_ID = "P001" というSQLを実行すると SQL0206N "P001" is not valid in the context where it is used. SQLSTATE=42703 のエラーが出ます。 SQLSTATEで調べても「"P001"の列がテーブルにない」ということみたいですが 列名で捉えている時点でおかしい気がします select * from xTABLE where EMP_ID = null のSQLは正常にテーブルのSELECT結果が返ってきます。 どうすればよいでしょうか?

  • 日付検索で0000-00-00 00:00:00を除外したい

    日付検索で0000-00-00 00:00:00を除外したい mysql5.0 データ型はdatetimeで日付検索をしたのですが、 日付が"0000-00-00 00:00:00"で登録されているデータも 検索結果に表示され困っています。 例えば、 SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') →これだと、hizukeが0000-00-00 00:00:00のデータも表示されてしまいます。 日付が0000-00-00 00:00:00で登録されているデータを除外するため 自分もいろいろしてみたのですができません。どなたか教えていただけないでしょうか。 参考までに、自分が試したsql文を書きます。↓ SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') and (hizuke != '0000-00-00 00:00:00') SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') and (hizuke <> '0000-00-00 00:00:00') SELECT * FROM user_tbl WHERE (DATE( hizuke ) <= '20100505') and (hizuke not in ('0000-00-00 00:00:00')) →上記載のsqlはすべて検索件数が0になってしまいました。 もうわからなくなってしまったので、アドバイスお願いします。

    • ベストアンサー
    • MySQL