- ベストアンサー
text型のデータをintegerにキャストしたいのですが…
お世話になります。 postgres+php4で現在開発をしています。 テーブル設計を間違っていたようで、年月が6桁の数値(200404 等)で入る項目をtext型で作っています。 この値を、where句の中でintegerとして扱いたいのですが、where句の中でキャストは出来ないものでしょうか? sqlは初心者でよく分かりません… どなたかアドバイスお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>select * from テーブル名 >where 年月 < '200101' and ...(略)... >上記の書き方は正しいのでしょうか… 文字列同士の比較をしているので「構文的には」正しい書き方です。 但し「構文的には正しい書き方」であっても、それが期待した結果を返すとは限りません。 今回のように「常に6桁のデータが入力されている事が保証されている」場合は問題はありませんが、6桁に満たないデータがあった場合は、期待した結果と違う結果になります。 例えば、4桁のデータを6桁のデータと比較してみましょう。数値扱いで 9999 < 200001 は真ですが、文字扱いだと '9999' < '200001' は偽になります。 この問題を回避するには、9999 を '009999' と入力させ、データが常に6桁になるようにする必要があります。 今回のケースでは「常に6桁同士の比較演算」との保証があるので select * from テーブル名 where 年月 < '200101' and ...(略)... で期待した結果になり問題はありませんが、入力されたデータの桁数が不定の場合は注意が必要です。
その他の回答 (2)
- ieyasu
- ベストアンサー率50% (2/4)
桁間違いの問題は、アプリケーション側で 入力チェックを行い、 データ挿入時にPHPのstr_padや、SQLのTO_CHARなどを 使い、6桁での記録を保証するようにしましょう。 6桁が保証されれば、chie65536さんのお答えどおりで 問題なく比較できるでしょう。 ※2004/11/01を 2004111 と保存してしまったら、 後からそれが、2004/11/01か2004/1/11かをプログラムが判断することは不可能でしょう。 ただ、データの挿入が、時系列に沿ってされているのでしたら、OID列の比較でデータ挿入日時の大小比較できるかもしれませんよね?>皆さん
- chie65536
- ベストアンサー率41% (2512/6032)
select 年月 , ...(略)... from テーブル名 where ((年月+0) < 200101) and ...(略)... とかでは駄目ですか?
補足
早速の回答有難うございました。 早速試してみましたが、ダメでした… select * from テーブル名 where 年月 < '200101' and ...(略)... 色々試してみて、上記の形だとエラーが出ず結果もうまく行ったように見えたのですが、上記の書き方は正しいのでしょうか…