- 締切済み
「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」という数字にしたいのですが、この処理方法をご教授お願いいたします。
- oh_wareo
- お礼率85% (6/7)
- その他(プログラミング・開発)
- 回答数4
- ありがとう数4
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- chukenkenkou
- ベストアンサー率43% (833/1926)
多くのRDBMSで同じ機能として実装されている、coalesce関数を使うといいでしょう。 decodeやnvlはoracle独自であったり、ifnullやnullifはRDBMS間で異なる機能として実装されています。 <SQL例> select coalesce(sum(aaa),0) from A group by code;
- don_go
- ベストアンサー率31% (336/1059)
select NVL(sum(人数), 0) from データ where .... ↑ではどうですか?(ORACLEの場合) #SQL Server, ACCESSの場合は #select ISNULL(sum(人数), 0) from データ where ....
お礼
ご回答ありがとうございました。 なお、お礼が遅れまして申し訳ございません。 ちょっと自分でも悩んでみて、結果プログラムにて、 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)
しまった。asはこの場合使えなかった。なのでこっち。 int h1 = (int)( s_h1.ExecuteScalar() ?? 0 );
お礼
ご回答ありがとうございました。 なお、お礼が遅れまして申し訳ございません。 ちょっと自分でも悩んでみて、結果プログラムにて、 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)
int h1 = s_h1.ExecuteScalar() as int ?? 0; 試さないで書いてますが。
お礼
ご回答ありがとうございました。 なお、お礼が遅れまして申し訳ございません。 ちょっと自分でも悩んでみて、結果プログラムにて、 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文が間違っていると思うのですがどのようにしたら良いのでしょうか何卒よろしくお願いします。
- ベストアンサー
- SQL Server
- 副問い合わせでの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 Server
- SQLで取得したフィールドをSQL文として利用
お世話になっております。 MYSQLで sql_id (int PK) sql_data (text) のようなテーブル(sql_db)を持ち select sql_id from where (sql_data をsqlとして実行した結果 ) > 200 のように、フィールドから取得した値をSQLとして実行したりする方法はございますでしょうか。 ご教授よろしくお願いいたします。
- 締切済み
- MySQL
- SQLでSUMなどの関数でデータが無い時に0を返したい。
SQLでSUMなどの関数でデータが無い時に0を返したい。 (例) SELECT SUM(項目) FROM テーブル WHERE 条件 ここで、条件に一致するデータが1件も無かった時ですが、 何かNULLのような物が1件返ってきているようです。 この条件に一致する物が無かった時に、 0を返したいのですが、可能でしょうか? よろしくお願いします。
- ベストアンサー
- Oracle
- 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が失敗してデータを取り出すことができませんでした。 正しくデータを取り出すためには、どのように記述すれば良いでしょうか?
- ベストアンサー
- SQL Server
- 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 Server
- 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では解決できないんでしょうか?
- ベストアンサー
- その他(データベース)
お礼
ご回答ありがとうございました。 なお、お礼が遅れまして申し訳ございません。 ちょっと自分でも悩んでみて、結果プログラムにて、 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; } のように例外処理にて解決いたしました。 ありがとうございました。