2012-02-10 11 views
1

私のコードのすべての部分を貼り付けることなく、何が起こっているのかを説明しようとします。postgresqlでクエリを実行する際の奇妙な動作

私は一人でこのクエリを実行する場合は、6.0(予想される動作)

select distancia_euclediana_para_imagenes(vector_cuadrante1, 
         vector_cuadrante2, 
         vector_cuadrante3, 
         vector_cuadrante4, 
         ARRAY[SQRT(8),SQRT(8)], 
         ARRAY[SQRT(8),SQRT(8)], 
         ARRAY[SQRT(8),SQRT(8)], 
         ARRAY[SQRT(8),SQRT(8)]) 
from imagen,pivotes 
where id=id_imagen and indice_pivote=2 

を返し、私はこの他のクエリを実行する場合、それは2(再び期待される動作を)返し

with distancia_a_pivote(distancia) as 
(select distancia_euclediana_para_imagenes(vector_cuadrante1, 
         vector_cuadrante2, 
         vector_cuadrante3, 
         vector_cuadrante4, 
         ARRAY[SQRT(8),SQRT(8)], 
         ARRAY[SQRT(8),SQRT(8)], 
         ARRAY[SQRT(8),SQRT(8)], 
         ARRAY[SQRT(8),SQRT(8)]) 
from imagen,pivotes 
where id=id_imagen and indice_pivote=2) 
select id from imagen, indice, distancia_a_pivote d 
where id=id_imagen and 
fqa[2]>= 6-1 and 
fqa[2]<= d.distancia+1; 

しかし、この小さな変更で、作業を停止して何も返しません。

with distancia_a_pivote(distancia) as 
(select distancia_euclediana_para_imagenes(vector_cuadrante1, 
         vector_cuadrante2, 
         vector_cuadrante3, 
         vector_cuadrante4, 
         ARRAY[SQRT(8),SQRT(8)], 
         ARRAY[SQRT(8),SQRT(8)], 
         ARRAY[SQRT(8),SQRT(8)], 
         ARRAY[SQRT(8),SQRT(8)]) 
from imagen,pivotes 
where id=id_imagen and indice_pivote=2) 
select id from imagen, indice, distancia_a_pivote d 
where id=id_imagen and 
fqa[2]>= d.distancia-1 and 
fqa[2]<= d.distancia+1; 

私はあなたがh私はこの問題を引き起こす原因がわからないので私はTDDのスタイルでコーディングしてきたので、私は右の行動を証明するためにテストを持っていると私はそれが

おかげ

+0

'fqa [2]とは何ですか?おそらく整数5? –

+0

はい、何が間違っているか考えていますか? – Watt

答えて

1

を仕事としていたかなりだったあなたはfqa[2]は、整数5で、d.distanciaがあると言うほか浮動小数点値6.0。それはあなたがこれを見て終わることを意味します

5 >= 6.0 - 1 

6.0はおそらく6.0 - 1が5.0未満日陰を出てくる可能性があり、あなたの比較が失敗するので、正確ではないことを。一つの解決策は、通常の浮動小数点の問題を考慮するために少しの余地を追加することです:

fqa[2] >= d.distancia - 1.00001 and 
fqa[2] <= d.distancia + 1.00001 

0.00001は一例であり、あなたが許可する必要がありますどのくらい余分に見るためにあなたの状況を見て必要があると思います。 ceil and floor呼び出しを追加することは、浮動小数点から整数への変換をより適切に制御できるため、別のオプションになる可能性があります。