• ベストアンサー

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"; }

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

  • ベストアンサー
  • 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