2012-01-12 9 views
8

私は、MySQLのテーブルでこれを持っている:なぜこのSQLクエリは浮動小数点数を比較する結果を返しませんか?

enter image description here

idbolag_idintです。 latおよびlngitudeは、doubleである。

私はlngitude列を使用している場合は、何も結果が返されません。

lngitude問合せ:私はlat列を使用する場合SELECT * FROM location_forslag WHERE lngitude = 13.8461208

はしかし、それリターン結果を行います。

latクエリ:SELECT * FROM location_forslag WHERE緯度= 58.3902782

lngitudeの問題点は何ですか?

+0

「WHERE lngitude Between 13.8461208 AND 13.8461209'」を試してください。 – Benoit

+0

@Benoitが13.8461207に変更され、13.8461208 –

答えて

9

=で浮動小数点数を比較するために、一般的に良いアイデアではありませんがオペレータに等しいです。あなたのアプリケーションのために

、あなたは答えになりたいどれだけ近いかを検討する必要があります。

1度は約112kmであり、0.00001度は約1.1m(赤道)である。 2つの点が0.00000001度= 1mm異なる場合、あなたのアプリケーションで「等しくない」と言ってもらいたいのですか?

set @EPSLION = 0.00001 /* 1.1 metres at equator */ 

SELECT * FROM location_forslag 
WHERE `lngitude` >= 13.8461208 [email protected] 
AND `lngitude` <= 13.8461208 + @EPSILON 

これは、lngitudeが希望値の@epsilonの範囲内にあるポイントを返します。 アプリケーションに適したイプシロンの値を選択する必要があります。

+2

SQL BETWEENキーワードこの場合は悪くありません(より読みやすいIMO)。 – Benoit

+1

'lngitude'のように使うのはどうですか13.8461208?それは解決策ですか? –

+0

@Lille_skutt:いいえ、どんな正確さを望んでいるかを意図的に判断し、明示的に比較する必要があります。 GISの拡張機能がインストールされていない限り、このデータベースには何も役立つものはありません。 – Ben

4

Floating points are irritating ....

WHERE ABS(lngitude - 13.8461208) < 0.00000005 
+0

に変更されても動作します。だから、それは他の列と一緒に働いたのは偶然のことですか?これをより良いデータ型で保存できますか? –

+0

最近のMySQLバージョンでは 'DECIMAL'データ型が正確です。リンクを参照してください。 – Wrikken

+0

データ型は問題ありません。問題は、 "equal"の意味はアプリケーションに依存しているということです。実際のところ、このようなことはありません。satnavアプリケーションでは、equalは "10m以内"かもしれません。土地登録データベースが「0.05メートル以内」の場合、十分な可能性があります。キッチンを建てると、「5mm以内」かもしれません。 – Ben

0

比較のためにfloatを10進数に変換します。私は同じ問題を抱えており、次のように解決しました。

SELECT 
    [dbo].[Story].[Longitude], 
    [dbo].[Story].[Latitude], 
    [dbo].[Story].[Location], 
FROM 
    [dbo].[Story], 
    [dbo].[Places] 
WHERE 
    convert(decimal, [dbo].[Story].[Latitude]) = convert(decimal, [dbo].[Places].[Latitude]) 
    and 
    convert(decimal, [dbo].[Story].[Longitude]) = convert(decimal, [dbo].[Places].[Longitude]) 
    and 
    [dbo].[Places].[Id] = @PlacesID 
    and 
    [dbo].[Story].IsDraft = 0 
ORDER BY 
    [dbo].[Story].[Time] desc 

WHERE句の後の最初の3行を見てください。 お手伝いをしてください。

関連する問題