ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

PostgreSQLコミュのIN句について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。
えびっちと申します。

最近Postgresを使用したWebシステムの運用保守を行っています。

最近その本番DBで取得条件でPKに対し、in句を用いると取得したデータに抜けが出るようになっており、ちょっと混乱しています。
例えば、
PKに'a','b','c'がある場合に、取得条件で

where PK in ('a','b','c')

とした場合、結果が'a','b','c'となるはずですが、'a','b'となったりします。

また、PK='a' or PK='b' or PK='c' というようにしても同様です。

本現象が発生しているのは、OSはFC1、PostgreSQLのバージョンは7.4.5です。

この現象がindexによるものかと思い、analyzeやvacuum fullを行っても、Explainで実行計画を見る限り、状況は改善されていないようです。

何か心当たりのある人はいらっしゃいますか?

コメント(9)

>MeijiKさま

numelicです。
これが原因でしょうか?
数字と文字列型の比較で暗黙のキャストがおきて、
それにより一致しないんではないですか?
>MeijiKさま

説明に誤りがありました。

実際には、PKは8桁の数字なので、in句の比較対象も数字です。

取得条件は以下のようになっています。

where PK in (12345678,22345678,32345678);

#簡単にwhere PK in ('a','b','c')と例をあげたのですが、
#それだと実際とは異なっていました。
#すいません。。
numeric? ならば数値なので、''をつける必要性がないのでは?
numericは、おそらくBCDなので、比較時に
暗黙の精度変換などがおこっている可能性が
あります。それをおこさないようにする比較方法があるはずですが....
と、いろいろ書きましたが、RDB一般の話をしただけで、
PostgreSQLはまだ詳しくないです。>>自分。
>MeijiKさま

無事解決しました。
どうやらPKの項目定義で桁数と精度を指定していなかった事が根本的な原因だったようです。

今回は以下の方法でPK項目の桁数と精度を指定することで解決しました。

where PK::numeric(8,0) in (12345678,22345678,32345678);

ありがとうございました。
解決してよかったですね。たぶん、桁数(Scale)と精度(Precision)を指定すると、指定した値で、固定小数点になりますが、指定しないと浮動小数点になって、一致しない場合がでてくるのだと思います。....とこれはOracleの話か....

SQL-99をみると、Precision省略時は、処理系定義になっているので、指定したほうがよいでしょうね....

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

PostgreSQL 更新情報

PostgreSQLのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング