• 締切済み

「C#」SQL実行でのNULL値の処理方法

質問は下記のとおりです。よろしくお願いいたします。 SqlCommand s_h1 = new SqlCommand("select sum(人数) from データ where 日付 >= '2008-04-01 00:00:00' and 日付 <= '2008-04-30 23:59:59', con); int h1 = (int)s_h1.ExecuteScalar(); で実行すると「指定されたキャストは有効ではありません。」とエラーが出ます。SQLで実行するとデータが無いため、値は「NULL」となっているのでintにキャストが出来ないというのは理解しました。 出来れば「NULL」の場合は「0」という数字にしたいのですが、この処理方法をご教授お願いいたします。

みんなの回答

回答No.4

多くのRDBMSで同じ機能として実装されている、coalesce関数を使うといいでしょう。 decodeやnvlはoracle独自であったり、ifnullやnullifはRDBMS間で異なる機能として実装されています。 <SQL例> select coalesce(sum(aaa),0) from A group by code;

oh_wareo
質問者

お礼

ご回答ありがとうございました。 なお、お礼が遅れまして申し訳ございません。 ちょっと自分でも悩んでみて、結果プログラムにて、 SqlCommand s_h1 = new SqlCommand("select sum(人数) from データ where 日付 >= '2008-04-01 00:00:00' and 日付 <= '2008-04-30 23:59:59', con); try{ int h1 = (int)s_h1.ExecuteScalar(); } catch{ int h1 = 0; } のように例外処理にて解決いたしました。 ありがとうございました。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

select NVL(sum(人数), 0) from データ where .... ↑ではどうですか?(ORACLEの場合) #SQL Server, ACCESSの場合は #select ISNULL(sum(人数), 0) from データ where ....

oh_wareo
質問者

お礼

ご回答ありがとうございました。 なお、お礼が遅れまして申し訳ございません。 ちょっと自分でも悩んでみて、結果プログラムにて、 SqlCommand s_h1 = new SqlCommand("select sum(人数) from データ where 日付 >= '2008-04-01 00:00:00' and 日付 <= '2008-04-30 23:59:59', con); try{ int h1 = (int)s_h1.ExecuteScalar(); } catch{ int h1 = 0; } のように例外処理にて解決いたしました。 ありがとうございました。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

しまった。asはこの場合使えなかった。なのでこっち。 int h1 = (int)( s_h1.ExecuteScalar() ?? 0 );

oh_wareo
質問者

お礼

ご回答ありがとうございました。 なお、お礼が遅れまして申し訳ございません。 ちょっと自分でも悩んでみて、結果プログラムにて、 SqlCommand s_h1 = new SqlCommand("select sum(人数) from データ where 日付 >= '2008-04-01 00:00:00' and 日付 <= '2008-04-30 23:59:59', con); try{ int h1 = (int)s_h1.ExecuteScalar(); } catch{ int h1 = 0; } のように例外処理にて解決いたしました。 ありがとうございました。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

int h1 = s_h1.ExecuteScalar() as int ?? 0; 試さないで書いてますが。

oh_wareo
質問者

お礼

ご回答ありがとうございました。 なお、お礼が遅れまして申し訳ございません。 ちょっと自分でも悩んでみて、結果プログラムにて、 SqlCommand s_h1 = new SqlCommand("select sum(人数) from データ where 日付 >= '2008-04-01 00:00:00' and 日付 <= '2008-04-30 23:59:59', con); try{ int h1 = (int)s_h1.ExecuteScalar(); } catch{ int h1 = 0; } のように例外処理にて解決いたしました。 ありがとうございました。

関連するQ&A

  • NULL値をSELECTする

    開発環境  Xp Home Edtion Microsoft Visual C++ 2008 Express Edition Microsoft SQL Server 2005 int i=0; String^ str1; sSqlConnection^ sqlConn = gcnew SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\SOUTUKEN\\test.mdf;Integrated Security=True;User Instance=True");qlConn->Open(); str1= "SELECT NoID FROM Table1 WHERE hentou IS NULL OR nyuryoku IS NULL"; sqlCommand^ sqlCmd=gcnew SqlCommand(str1,sqlConn); SqlDataReader^ exeReader=sqlCmd->ExecuteReader(); while(exeReader->Read()){ gyou[i]=exeReader[""]->ToString(); i++; } sqlConn->Close(); SELECT文でhentou,nyuryokuのどちらか一方でもNULLならばそのNoIDを取り出すということをしたいのですが、 "sqlCommandが定義されていない識別子です。"というエラーが出てきます。 SQL文が間違っていると思うのですがどのようにしたら良いのでしょうか何卒よろしくお願いします。

  • 副問い合わせでのNULLの抽出方法

    SQLについての質問です。 副問い合わせを使用したとき、NULLのデータも含めて抽出したいの ですが、どうもうまくいきません。 やりたいことを説明すると、まず以下の構造のテーブルがあります テーブル    コード 金額  -------------- 01  |100   01  |110   02  |090   02  |080   03  |200   04  |100   04  |150   05  |400   09  |350   null |100   null |200   集約後データ コード -------- 01  |<--- 1件目 02  |<--- 2件目 03  |<--- 3件目 04  |<--- 4件目 05  |<--- 5件目 09  |<--- 6件目 null |<--- 7件目 まず、テーブルをコードで集約します。集約された結果のデータで上位○件と いう制御をかけたい為、ROWNUMを使用しています。 ただ、実際にほしいデータは集約する前のデータの為、一度集約とROWNUMを使って 絞りこんだデータを副問い合わせしています。 但し、このときNULLが入ったコードも取得する必要があります。 現在のSQLはこんな感じです。 SELECT コード、SUM(金額) FROM テーブル WHERE コード IN ( SELECT コード FROM テーブル WHERE ROWNUM <= 10 GROUP BY コード ) GROUP BY コード このSQLだと、NULLが省かれてしまうため上位6件までしか抽出できません。 実際、NULLを含んだデータを副問い合わせで取得することは可能でしょうか? データベースはオラクル9iです。 宜しくお願いします。

  • SQLServerのクエリ速度の違いについて

    Webアプリケーション(ASP.NET)より、SQLServer2005に対してデータを取得しています。 その際にSELECT句のSQL文を実行しているのですが、以下のパターンによって処理速度が異なります。 ■ パターン(1) SQLCommandクラスに対して、SQL文、パラメータを渡し実行. 処理時間 = 1分程度. [SQL文] SELECT * FROM T_TEST WHERE code = @code; [ソース] Dim sqlCom As New SqlCommand(strSql, con) sqlCom.Parameters.add(New SqlParameter("@code", SqlDbType.Int)).Value = 100 …略 ■ パターン(2) 以下のSQL文をSQLCommandクラスに渡して実行. 処理時間 = 15秒程度. [SQL文] DECALRE @code As Int; SET @code = 100; SELECT * FROM T_TEST WHERE code = @code; [ソース] Dim sqlCom As New SqlCommand(strSql, con) …略 システム自体はパターン(1)の形で共通のメソッドを作成しています。 処理が遅かったのでSQLをSSMSにて解析しようとして、パターン(2)の様に変数定義をDECLAREで記述した所、速くなり、 実際のシステム上で試した所、同じような速度となりました。 パターン(1)の様な形ではパターン(2)の様な速度はやはり出ないのでしょうか? ちなみにProfilerでパターン(1)のSQL文を見たら、"EXEC sp_executesql N'SELECT ~"が実行されていました。 以上、どなたか分かる方ご教授ください。

  • SQLで取得したフィールドをSQL文として利用

    お世話になっております。 MYSQLで sql_id (int PK) sql_data (text) のようなテーブル(sql_db)を持ち select sql_id from where (sql_data をsqlとして実行した結果 ) > 200 のように、フィールドから取得した値をSQLとして実行したりする方法はございますでしょうか。 ご教授よろしくお願いいたします。

  • SQLでSUMなどの関数でデータが無い時に0を返したい。

    SQLでSUMなどの関数でデータが無い時に0を返したい。 (例) SELECT SUM(項目) FROM テーブル WHERE 条件 ここで、条件に一致するデータが1件も無かった時ですが、 何かNULLのような物が1件返ってきているようです。 この条件に一致する物が無かった時に、 0を返したいのですが、可能でしょうか? よろしくお願いします。

  • SQL文の実行速度について

    こんにちは。SQLを勉強しています。 質問をさせてください。 Oracleテーブル(test_table:レコード数はかなりあると考えて構いません) にnumber(int),value(varchar), code(varchar)の3つのフィールドが存在 するとします。 今、codeを指定してvalueを取得したいと考えています。 (1)---------------------------- select value from test_table where code='001'; select value from test_table where code='002'; select value from test_table where code='003'; (2)---------------------------- select code, value from test_table where code='001' or code='002' or code='003' (1)と(2)ではどちらが実行速度が速いのでしょうか? 実際に実行すればわかることですが、そういった環境が ないので、確認できません。宜しくお願い致します。

  • SQLの条件文

    以下のデータで、dataで始まり、かつ数値部分を100~300の範囲で抽出したいと考えています。 テーブル名はtable1、フィールド名はretuです。 -retu- data023 unknowndata data105 data203 data827 SELECT retu FROM table1 WHERE retu LIKE 'data%' AND CAST(RIGHT(retu,3) AS Int) BETWEEN 100 AND 300 上記のSQLを作ってみたのですが、これだとunknowndataに対してCASTが行われてしまうらしく、CASTが失敗してデータを取り出すことができませんでした。 正しくデータを取り出すためには、どのように記述すれば良いでしょうか?

  • 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結果が返ってきます。 どうすればよいでしょうか?

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

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

  • SQLの書き方を教えて!

    select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?

専門家に質問してみよう