Rmysql查询没有返回正确的值?
我在r中有一个查询,使用rmysql包:Rmysql查询没有返回正确的值?,mysql,sql,r,rmysql,Mysql,Sql,R,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
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
我想在空气密度上增加额外的过滤器,如:
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"
)
这只是一行包含空气密度=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
但当我试图过滤其他空气密度的基础上,它不会返回任何东西。就像在上面提到的查询中,我把空气密度设为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
我不知道为什么会这样
FLOAT
和DOUBLE
数据类型不精确
如果保存值1.225
,则可以将其保存为1.22500001
。
当您尝试查询值为1.225
的所有数据时,它将找不到它,因为它保存为1.22500001
您最好使用数据类型DECIMAL
或NUMERIC
或者尝试将FLOAT
值转换为DECIMAL
,如下所示:
CAST(Air_density as DECIMAL(10,3))
这是来自MySQL的文档:
11.2.3浮点类型(近似值)-浮点、双精度
FLOAT和DOUBLE类型表示近似的数字数据值。
MySQL使用四个字节表示单精度值,使用八个字节表示单精度值
双精度值
对于FLOAT,SQL标准允许一个可选的
精度(但不是指数的范围),单位为
括号中的关键字FLOAT。MySQL还支持这个可选的
精度规格,但精度值仅用于
确定存储大小。0到23之间的精度将产生4字节
单精度浮点列。精度从24到53的结果是
8字节双精度双列
MySQL允许非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE
精度(M,D)。这里,(M,D)表示可以存储的值最多为
共M位,其中D位可能在小数点后。
例如,定义为FLOAT(7,4)的列看起来像-999.9999
当显示时。MySQL在存储值时执行舍入,因此如果
在FLOAT(7,4)列中插入999.00009,近似结果为
999.0001
因为浮点值是近似值,而不是存储为精确值
如果在比较中试图将其视为精确值,则可能导致
问题。它们也受平台或实施的影响
依赖关系。有关更多信息,请参见第B.5.4.8节“问题
“使用浮点值”
为了实现最大的可移植性,需要存储近似数字的代码
数据值应使用浮点或双精度,无规范
指精度或位数
此链接也应该对您有所帮助:
为什么要将(明显的)小数与字符串值进行比较?是的,你应该像霍尼獾说的那样写“AND Air_density=1.225”。@霍尼獾,如果我喜欢,它不会改变任何东西:
AND Air_density=1.225
,它返回的值与Air_density
类型的float
?@dns_nx,是的。