![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
レコードなし、もしくは該当レコードなしでエラーを発生させない方法を教えてください
データベース初心者です
レコードなしもしくは該当レコードなしの状態で検索を行うとエラーが発生します。
エラーを発生させずに検索を行う方法があれば教えてください。
MySQL 5.0.67
レコードは下記のようになります。
desc table;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| val1 | smallint(6) | NO | PRI | 0 | |
| val2 | smallint(6) | NO | PRI | 0 | |
| val3 | smallint(6) | NO | PRI | 0 | |
| date_y | char(4) | NO | PRI | | |
| date_m | char(2) | NO | PRI | | |
| pre | bigint(19) | NO | | 0 | |
| now | bigint(19) | NO | | 0 | |
+----------+----------------------+------+-----+---------+-------+
下記のSQL文で検索を行いました。
SELECT t.date_y, t.date_m
FROM table t,
(
SELECT date_y,max(date_m*1) as date_m
FROM table
WHERE date_y=
(
SELECT max(date_y*1) as date_y
FROM table
WHERE (now - pre) > 0
)
) s
WHERE t.date_y=s.date_y and t.date_m=s.date_m;
レコードなし、もしくは該当レコードがないとWHERE文のdata_yにnullが代入され、
本SQL文でエラーが発生します。
いろいろ調べて「EXISTS」「NOT EXISTS」「NULLIF」を利用するのかな?
と思ったのだけど、下記URLを参照しても、うまくSQL文が書けませんでしたので、ご教授頂ければ幸いです。
6.4.2.6. EXISTS と NOT EXISTS
http://dev.mysql.com/doc/refman/4.1/ja/exists-an …
6.3.1.4. フロー制御関数
http://dev.mysql.com/doc/refman/4.1/ja/control-f …
No.3ベストアンサー
- 回答日時:
自信ありませんが
SELECT t.date_y, t.date_m, sum(day01) as sum_day01, sum(day02) as sum_day02, sum(day03) as sum_day03, sum(day30) as sum_day30, sum(day31) as sum_day31
FROM `table` t,
( SELECT date_y,date_m FROM `table`
WHERE now > pre
order by date_y desc, date_m desc
limit 1
) s
WHERE t.date_y=s.date_y and t.date_m=s.date_m;
この回答への補足
nora1962さん
ご回答ありがとうございます。
nora1962さんのSQL文の動作確認をさせて頂きました。
また、こちらで確認したケースは4つになります。
(1)レコードなしの場合
(2)レコードありだけど、該当レコードなしの場合
例)2010年1月のレコードは存在するが、データが全て0の場合
(3)ある月のレコードありでデータ1以上があり、ある月の翌月のレコードありでデータが全て0の場合
例)2010年1月のレコードが存在しデータが全て0以上、2010年2月のレコードが存在しデータが全て0の場合
(4)ある月のレコードありでデータが半分程度ありの場合
例)2010年11月19日までのデータが1以上で11月20から30までのデータが0の場合
ぼほ、こちらで想定している動作となりました。。。
が、追加要求をさせて頂きますと、(1)と(2)のケースで1件レコードを取得します。
できれば(1)と(2)のケースでは1レコードも取得できない方が処理効率が良いのですが。。。
なので、もう少し質問をさせて頂きたいと思います。
どうぞ、宜しくお願い致します。
No.2
- 回答日時:
なんとなくわかってきましたが
単にYの最大値の内、Mの最大値をほしいなら以下でよいのでは?
SELECT date_y,date_m FROM tbl
WHERE now>pre
ORDER BY date_y DESC,date_m DESC
LIMIT 1
この回答への補足
yambejpさん
こちらでもご回答頂きまして、誠にありがとうございます。
ただ、やっぱり、端折ったレコードで質問したのでは無理がありました。
本当に申し訳ございません。
実際の詳細レコードは以下のようになっております。
pre:前月のval1,val2,val3が同じnowの値が保存されています。
now:本レコードのday01~day31までの合計値が保存されています。
desc table;
+----------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+-------+
| val1 | smallint(6) | NO | PRI | 0 | |
| val2 | smallint(6) | NO | PRI | 0 | |
| val3 | smallint(6) | NO | PRI | 0 | |
| date_y | char(4) | NO | PRI | | |
| date_m | char(2) | NO | PRI | | |
| pre | bigint(19) | NO | | 0 | |
| now | bigint(19) | NO | | 0 | |
| day01 | smallint(6) unsigned | NO | | 0 | |
| day02 | smallint(6) unsigned | NO | | 0 | |
~~~ 途中省略 ~~~
| day30 | smallint(6) unsigned | NO | | 0 | |
| day31 | smallint(6) unsigned | NO | | 0 | |
+----------+----------------------+------+-----+---------+-------+
#書ききれなかったのでお礼に続きを記載します。。。
欲しいのは最新の年月日です。
1レコードにはその月の1日~30日分のデータがあります。
例えば以下のレコードデータが存在したとします。
date_y='2010' date_m='10' day01=1 day02=2 day03=0 ~途中省略~ day30=1 day31=2
date_y='2010' date_m='10' day01=1 day02=2 day03=0 ~途中省略~ day30=1 day31=2
date_y='2010' date_m='11' day01=1 day02=0 day03=0 ~途中省略~ day30=0 day31=0
date_y='2010' date_m='11' day01=2 day02=2 day03=0 ~途中省略~ day30=0 day31=0
date_y='2010' date_m='11' day01=1 day02=2 day03=0 ~途中省略~ day30=0 day31=0
このとき、まず最新の年月を割り出し、ここでは2010年11月になります。
その後、2010年11月の全レコードより各日付の合計値を取得し、31日から1日向けて1以上の値が入っている日付を探します。
ここでは、2010年11月2日が最新の日付になります。
※31日から1日に向けて1以上の値が入っているかの確認はプログラム上で行います。
実際に記述したSQL文は以下になります。
SELECT t.date_y, t.date_m, sum(day01) as sum_day01, sum(day02) as sum_day02, sum(day03) as sum_day03, ~途中省略~ , sum(day30) as sum_day30, sum(day31) as sum_day31
FROM table t,
(
SELECT date_y,max(date_m*1) as date_m
FROM table WHERE date_y=
(
SELECT max(date_y*1) as date_y
FROM table
WHERE now > pre
)
) s
WHERE t.date_y=s.date_y and t.date_m=s.date_m;
長くなって申し訳ありませんが、宜しくお願い致します。
No.1
- 回答日時:
何をしたいのかもう少しきちんと文章で説明したほうがいいですよ。
maxをとっていてgroup byしてないし、サブクエリのつなぎ方も変なので
根本的に文法がまちがっているような気がします。
ちなみにNULL回避にはCOALESCEなどを使うことが多いですが
この回答への補足
ご回答ありがとうございます。
説明不足で申し訳ありません。
本SQL文では「(now - pre) > 0」が絶対条件で最新の年月を取得しようと考えています。
また、最新の年月が取得できなくても、エラーにしないようにしたいと思っています。
年(date_y)および月(date_m)が同じであるレコードが複数存在します。
その辺については考慮します。※「GROUP BY」は使用しないつもりです。
また、「COALESCE」についても調べさせて頂きました。
ちょっと使い方が分からなくて申し訳ありませんが、教えて頂けるとありがたいです。
コレだと文法エラーになって、どうすれば。。。
↓
SELECT t.date_y, t.date_m
FROM table t,
(
SELECT date_y,max(date_m*1) as date_m
FROM table
WHERE date_y=
(
SELECT COALESCE (max(date_y*1) as date_y
FROM table
WHERE (now - pre) > 0, 1)
)
) s
WHERE t.date_y=s.date_y and t.date_m=s.date_m;
申し訳ありませんが、宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access にて "mm:ss.0" 形式の ...
-
EXCELで外部データの取り込みが...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
既存データをINSERT文にして出...
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
ExcelのMatch関数のようなもの...
-
【SQL】他テーブルに含まれる値...
-
timestamp が空のデータを除い...
-
SQLSERVER 連番更新について
-
T-SQLで任意の箇所で強制終了す...
-
Accessの構成をコピーしたい
-
timestampのデータはどのように...
-
複雑なSQL文を独学する方法
-
エラーを起こす方法
-
テーブル名が可変の場合のクエ...
-
データ無し時は空白行にしたい...
-
ora-01722のエラーについて
-
CASEでBETWEEN制約
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PostgreSQLのtimestamp型で時間...
-
Access にて "mm:ss.0" 形式の ...
-
今って秋田新幹線へ動いてますか?
-
MySQLで期間のUNIQUEってできま...
-
SELECT の仕方 (今月のデー...
-
予約システムでの時間の設計に...
-
開始日と終了日が設定されてい...
-
絶対参照と相対参照の違いを教...
-
オラクルのnumber
-
GROUP BYを使って書けますでし...
-
SQL文の書き方
-
MS_ACCESSでINSTR関数を使いたい。
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
既存データをINSERT文にして出...
-
truncate tableを使って複数の...
-
オラクルのUPDATEで複数テーブル
-
UPDATEで既存のレコードに文字...
おすすめ情報