TABLEAにタイプnVarchar(50)のフィールドがあり、テーブル結合関係で、タイプfloatの別のテーブルTABLEBの別のフィールドと照合したいと考えています。結合でこれら 2 つのフィールドを正しく一致させるにはどうすればよいですか?
left join UPS u on RTRIM( LTRIM(Str(u.Float_Field,10, 10))) = e.NVarchar_Field
TABLEAにタイプnVarchar(50)のフィールドがあり、テーブル結合関係で、タイプfloatの別のテーブルTABLEBの別のフィールドと照合したいと考えています。結合でこれら 2 つのフィールドを正しく一致させるにはどうすればよいですか?
left join UPS u on RTRIM( LTRIM(Str(u.Float_Field,10, 10))) = e.NVarchar_Field
次の 2 つのことを考慮する必要があります。
float の内部表現は、最初は等しいように見える 2 つの数値の間に「小さな」違いを引き起こす可能性があります (ゼロとゼロの比較を除いて)。例として 1.9999999999 と 2.0 を取り上げます。
float の文字列表現も14.55
数学的に等しいので異なる場合があります1.455E2
が、文字列はまったく異なって表示されます (異なる文字が含まれます)。
したがって、実際に比較できるのはrangeだけです。浮動小数点数の範囲(私見の方が良い)または文字列の範囲を比較できます(浮動小数点数が両側で同じようにフォーマットされていることを確認する場合:小数点以下の桁数が同じで、指数表記がないなど)。
私が言いたいのは、SQL に文字列を解析させて (CONVERT
たとえば、使用して) float にし、数値の差が等しいと見なせるほど小さいかどうかを確認する必要があるということです。たとえばABS(a - b) < 0.0000001
。