2017-11-16 18 views
0

私はrmysqlパッケージを使用して、Rでクエリを持っている:これは、テーブルをRmysqlクエリで正しい値が返されませんか?

sql.query = paste0("SELECT * FROM performance_db.pcTab WHERE 
         fk_ID_calc = (SELECT ID_calc FROM performance_db.calculationTab WHERE 
         turbine_model = '",input$t1,"' AND 
         op_mode = '",input$t2,"' AND 
         date_entered ='",input$t3,"') 
         AND sensor = 'P_el'" 
) 
    spc = fetch(dbSendQuery(conn, sql.query), n = -1) 

戻る:

head(spc) 
    ID_pc voltage_side sensor Air_density v2.5 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 
1  1   0 P_el  1.225 0 44 184 404 721 1165 1686 2107 2272 2300 2300 2300 2300 2300 2300 2300 2300 2300 
2  2   0 P_el  1.000 NA 33 155 346 622 1010 1486 1967 2224 2286 2294 2300 2300 2300 2300 2300 2300 2300 
3  3   0 P_el  1.030 NA 35 161 358 642 1041 1529 1999 2235 2291 2297 2300 2300 2300 2300 2300 2300 2300 
4  4   0 P_el  1.060 NA 37 167 369 661 1072 1571 2036 2249 2295 2300 2300 2300 2300 2300 2300 2300 2300 
5  5   0 P_el  1.090 NA 39 173 381 681 1103 1612 2060 2256 2300 2300 2300 2300 2300 2300 2300 2300 2300 
6  6   0 P_el  1.120 NA 42 178 392 701 1134 1649 2080 2263 2300 2300 2300 2300 2300 2300 2300 2300 2300 

私は同じようAir_densityに追加のフィルタを追加したい:

sql.query = paste0("SELECT * FROM performance_db.pcTab WHERE 
         fk_ID_calc = (SELECT ID_calc FROM performance_db.calculationTab WHERE 
         turbine_model = '",input$t1,"' AND 
         op_mode = '",input$t2,"' AND 
         date_entered ='",input$t3,"') 
         AND sensor = 'P_el' AND Air_density = 1" 
) 

これはAir_density = 1の情報を含む1行の戻り値です。

ID_pc voltage_side sensor Air_density v2.5 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 
1  2   0 P_el   1 NA 33 155 346 622 1010 1486 1967 2224 2286 2294 2300 2300 2300 2300 2300 2300 2300 

しかし、他のAir_densitiesでベースをフィルタリングしようとすると、何も返されません。上記のクエリで私はAND Air_density = 1.225を置く場合と同様:

head(spc) 
[1] ID_pc  voltage_side sensor  Air_density v2.5   v3   v4   v5   v6   
[10] v7   v8   v9   v10   v11   v12   v13   v14   v15   
[19] v16   v17   v18   v19 

私はそれが起こっている理由はわかりません!

+2

は、なぜあなたは、文字列値に(見かけの)小数を比較していますか? – HoneyBadger

+0

はい、あなたはHoneyBadgerが言ったように "AND Air_density = 1.225"と書くべきです。 –

+0

@HoneyBadger、私が好きなら何も変更しません: 'AND Air_density = 1.225'、同じ値を返します – Ali

答えて

1

FLOATおよびDOUBLEのデータ型は正確ではありません。

値をに保存すると、1.22500001として保存できます。 そして、値を持つすべてのデータを照会しようとすると、1.22500001として保存されているため、データは検出されません。

あなたはより良いデータ型DECIMALまたはNUMERIC を使用するか、このようなDECIMALとしてCASTFLOAT値を試してみてください:

11.2.3浮動:これは、MySQLのドキュメントからです

CAST(Air_density as DECIMAL(10,3)) 

ポイントタイプ(近似値) - FLOAT、DOUBLE

FLOA TおよびDOUBLEタイプは、おおよその数値データ値を表します。 MySQLは単精度値に4バイト、倍精度値には を8バイト使用します。 FLOATについて

、標準SQLは、括弧内 キーワードFLOAT次のビットに 精度(ただし、指数の範囲)のオプションの仕様を可能にします。 MySQLはこのオプションの 精度指定もサポートしていますが、精度値は の格納サイズの決定にのみ使用されます。 0〜23の精度は、4バイトの 単精度FLOAT列になります。 24〜53の精度は、8バイトの倍精度DOUBLE列 になります。

MySQLは、標準以外の構文、FLOAT(M、D)またはREAL(M、D)またはDOUBLE PRECISION(M、D)を許可します。ここで、(M、D)は、数値が合計で M桁で格納されていることを意味します。そのうち、D桁は小数点以下である可能性があります。 たとえば、FLOAT(7,4)として定義された列は、-999.9999 のように表示されます。 MySQLは値を格納するときに丸めを行います。したがって、 を999.00009をFLOAT(7,4)列に挿入すると、おおよその結果は 999.0001になります。

浮動小数点値は概算値であり、正確な 値として格納されていないので、 問題につながる可能性の比較に正確として扱うことを試みます。彼らはまた、プラットフォームまたは実装 依存関係の対象です。詳細については、最大の移植について

、精度のない仕様 とFLOATまたは倍精度を使用する必要が概数 データ値のコードが必要なストレージ「浮動小数点値の問題 」セクションB.5.4.8を参照または桁数。

https://dev.mysql.com/doc/refman/5.7/en/floating-point-types.html

このリンクは、あまりにも、あなたを助ける必要があります。

https://dev.mysql.com/doc/refman/5.7/en/problems-with-float.html

関連する問題