• ベストアンサー

if文でゼロとNULLを除外するための初歩的文法

人口($pop)と面積($area)から人口密度を計算する際、 MySQLから取り出したデータに、ゼロやNULLが混在しているので、 (1) 分母や分子がゼロの場合 (2) 分母や分子がNULLの場合 は、割り算しないようにしたいのですが、 単純に以下のようにすると、 (1) はN/Aと表示されますが、(2)ではN/Aが表示されません。 NULLもはねるようにするにはどのように記述したらよいでしょうか。 if ($pop > 0 and $area > 0){ $density = $pop / $area ; } else { $density = "N/A"; }

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • fly1435
  • ベストアンサー率80% (4/5)
回答No.2

「===」という演算子で、値と同時に型も比較してくれますので、 $pop = null; $area = 50; if($pop !== null and $area !== null and $pop > 0 and $area > 0) { } else { } としてあげれば、希望の動作は満たすと思います。 ただ、このやり方が正解なのかどうかは自分にはわかりません。。。

参考URL:
http://jp.php.net/manual/ja/language.operators.comparison.php
litton101
質問者

お礼

御礼遅くなって失礼しました。 (作業がここまで到達せず。。。) まさにご回答のような方法をお尋ねした次第ですが 残念ながら希望通りにはなりませんでした。 別の何かが誤っていたのでしょうかね・・ とにかく、貴重なアドバイスありがとうございました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

NULLの検査にはis_nullが使えます

litton101
質問者

お礼

御礼遅くなって失礼しました。 (作業がここまで到達せず。。。) 貴重なアドバイスありがとうございました。 is_nullについて調べてみます。

回答No.1

MySQLに発行するSELECT文で、NULLだったら、0を返すようにするか、$density をSQLで計算することをお勧めします。 SELECT IFNULL(area, 0) AS area, IFNULL(pop, 0) AS pop ... みたいな感じですかね。 または、 SELECT CASE WHEN area IS NULL OR pop IS NULL OR area = 0 OR pop = 0 THEN 'N/A' ELSE pop/area END AS density ... 標準SQLですと、CASE式の返す値は型が同じじゃないといけないんですが・・・ MySQLだと通っちゃいます。

litton101
質問者

お礼

御礼遅くなって失礼しました。 (作業がここまで到達せず。。。) 今回は諸事情で使うことができませんが、 SQL側でという発想はありませんでした。 参考にさせていただきます。

関連するQ&A

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

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

  • NULL値を含むソート

    MySQL4.0.20を使っています。 以下のようなデータをソートすると NULLが先に表示されます。 これをNULLを最後にして、数値のソートをかけたいです。何か解決策はありますか?2回に分ける方法しかないのでしょうか? nullと非null ◆元データ A --- 5 NULL 2 NULL 3 1 select A from xxx order by A asc; ●望まない結果 A --- NULL NULL 1 2 3 5 ●望む結果 A --- 1 2 3 5 NULL NULL ※話は変わりますが、4.1で日本語EUCの文字化けバグは直っているのでしょうか?

    • ベストアンサー
    • MySQL
  • 整数となる分数

    a、bを正の整数とする 任意の正の整数nに対して(n^3+an-2)/(n^2+bn+2)の値が整数となるようaとbの値を定めよ 分母は分子×分子で割り算した商+余りなのでそれで書きかえてn-b+{(a+b^2-2)n+2(b-1)}/n^2+bn+2 nもbも正の整数だから無視して{(a+b^2-2)n+2(b-1)}/n^2+bn+2が整数となればよい というところまでは分かりましたが、ここからどうすればよいかわかりません 教えてください

  • GREATESTで NULLをスルーする方法は?

    ・MySQLのGREATESTで、引数のどれかが NULL である場合、NULLを戻さず、それ以外の残りから ( 最大値の ) 引数を戻すことは可能でしょうか? ・また、GREATEST以外で、同じような処理をするにはどうすれば良いでしょうか? ・後、MAXとは何が違うのでしょうか? ■最終的にやりたいこと ・「aカラム」と「NULLを含むbカラム」の最大値基準で、降順表示したい

    • ベストアンサー
    • MySQL
  • 極限値

    (1) lim[n→∞]√(x+3)-√(x)/√(x+2)-√(x+1) 分子有理化をして、 分子分母に√(x+3)-√(x)をかけて、 lim[n→∞] 3 /{√(x+2)-√(x+1)}{√(x+3)-√(x)} さらに分子分母をxで割りました。 3/∞になって0になります。 しかし、解答は3です。 (2) 数列{a_n}の極限値を求める。 a_n=1^2+2^2+…+n^2/n^3 こちらは全く分かりません。 分子分母をn^2で割りましたが、 なにも進みません…。 なにかヒントをお願いします。

  • null 判定について

    javascriptに関して質問させて下さい。 accessのDBのデータをHTML上で表示・追加・削除・更新を行っています。 DB上のデータで空欄の項目を表示させたときに null が表示されます。 nullではなく空欄にしておきたいので、null判定チェックを 行っているのですが、ひっかかってくれない状態です。 ------------- var database; database = new ActiveXObject("ADODB.Connection"); database.Open("Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\\mydb.mdb;"); var mySql = "select 種別, 内容 from Aテーブル; var recordSet = database.Execute(mySql); var tempHtml = "種別=" + recordSet(0); if(recordSet(1) != null){ tempHtml = tempHtml + "<br>内容=" + recordSet(1); }else{ tempHtml = tempHtml + "<br>内容="; } (略) --------------- recordSet(0)=種別 recordSet(1)=内容 上記のように普通にnull判定をしてるつもりなのですが、 recordSet(1)=内容 が access上で空欄の場合=null もif文内に入り、 「null」という文字列が表記されます。 ※accessからとってきたデータではなく、  javascript内で null を設定した場合はチェックにひっかかっています。 var tmp = null; if(tmp == null){ alert("nullである"); } 何が悪いかお分かりになる方、ご回答お願いします。

  • 既約分数の表示プログラム

    (1)キーボードから,分子,分母に相当する整数2つを入力し,その既約分数を表示せよ。 (2)分母が1の時には,分子のみを表示する。 (3)分子と分母の符号が異なるときにのみ,-符号を表示する。 (4)分母がゼロの入力エラーに対しては、再入力するように促す。 (5)分子と分母の最大公約数も求めて表示する。 (6)また、正しく計算できる最大規約分数を示せ。 #include <stdio.h> int main(void) { int a,b,i=1,x,y,z; printf("分子=");/*分子の入力*/ scanf("%d",&a); printf("分母=");/*分母の入力*/ scanf("%d",&b); if(b==0) { printf("分母が0です。入力が誤っています。\n"); return 0; } if(b==1) { printf("既約分数は %d\n",a); return 0; } while((i<=a)&&(i<=b)) { if((a%i==0)&&(b%i==0)) { x=i;i=i+1; /*xを上書きしていく*/ } else { i=i+1; } } printf("分子と分母の最大公約数=%d より\n",x); y=a/x; z=b/x; printf("既約分数は %d/%d\n",y,z); return 0; } 大学の課題で出されたものです。(1)(2)(4)(5)はできたのですが、(3)と(6)の部分のやり方がいまいちよくわからなかったので質問しました。 どなたかご教授お願いできないでしょうか・・・。

  • 数学III・C問題計算方法

    極限を求めよ lim(n→∞)√(n^3+1)/√(n^2+1)+√n=lim(n→∞)√{n+(1/n^2)}/√{1+(1/n^2)}+√(1/n)=∞ ととある問題集の解答に書いてあるんですが 途中式が1つ目の式から次の式までの仮定と なぜ最終的に∞になるのかがわかりません 分母にもnがあり、分子にもnがあったら 最終的に 分子>分母の場合→∞ 分子<分母の場合→0 になると思うんです でもなぜ無限大とわかるのでしょう? 解説よろしくお願いします。

  • ゼロとNULLを区別して number_formatしたい

    環境:MySQL4.0.25 と PHP4.3.11の組み合わせで、SQLで select data1 from mytable として、取り出したdata1には、次のようにNULLとゼロと数値が 混在しています。 4334.0028 8893.212233 4334.2 <NULL> 0 2.002 9893 桁がバラバラなので、これらに number_format(data1,2) としたら、 NULLまでもが0.00と表示されてしまいます。 今回、NULLとゼロ(0.00)は区別しなければならなので、 echo ($data1 == '') ? '' : number_format($data1,2) ; としましたが、効きません。WWWでイコール3つ(===)演算子を 使えば回避できるような情報を見かけましたが echo ($data1 !== '') ? number_format($data1,2) : '' ; としても、状況変わらず。何かうまい方法はないでしょうか。 なお、SQL側で format(data1,1) とするのはナシとしてご教示いただけ ますと幸いです(data1でいろいろ計算するのでformatされた値が 出てくると誤差の原因になってしまうためです)。

    • ベストアンサー
    • PHP
  • Access SQLでnull値のOrderby

    お世話になります、 AccessのSQLについて教えてください。 例えば打率をSQLの中で計算させたとします。その値で Order by して表示させたいのですが、計算結果がnull (打席が0の人)は分母が0になってしまい値が存在しない (null)ですよね、その場合にOrder byを行うとSQLでエラーになってしまいます。 このような場合皆様ならどのように回避されるでしょうか? select B.daritu From (select hit/dasu As daritu From A ) As B Order by B.daritu

専門家に質問してみよう