sql - 为什么浮点值只能在 where 条件下作为文本找到
问题描述
如果没有引用参数,为什么找不到该行?
CREATE TABLE test (id integer, value real);
INSERT INTO test VALUES (1, 0.1);
不工作:
SELECT * FROM test where value = 0.1;
id | value
----+-------
(0 rows)
作品!
SELECT * FROM test where value = '0.1';
id | value
----+-------
1 | 0.1
(1 row)
解决方案
您应该避免不精确的数据类型(如real
):
不精确意味着某些值无法精确转换为内部格式并存储为近似值,因此存储和检索值可能会显示出细微的差异。管理这些错误以及它们如何通过计算传播是整个数学和计算机科学分支的主题,这里将不讨论,除了以下几点:
如果您需要精确的存储和计算(例如货币金额),请改用数字类型。
如果你想用这些类型对任何重要的事情进行复杂的计算,特别是如果你依赖边界情况下的某些行为(无穷大、下溢),你应该仔细评估实现。
比较两个浮点值是否相等可能并不总是按预期工作。
如果您坚持使用 real 确保两个参数具有相同的数据类型:
SELECT * FROM test where value = 0.1::real;
推荐阅读
- php - MSSQL int 递增 1:递增 2 而不是 1
- node.js - 密码函数:OPENSSL_internal:BAD_DECRYPT
- python-3.x - 我怎样才能给数组索引一个标签以便调用它?
- docker - Docker 容器 Windows,通过 RDP 或 VNC 客户端连接
- sql - 如何计算用户留存图表中的总百分比
- c# - 如何通过使用字节而不是 GetPixel() 方法来提高 C# 算法的速度?
- reactjs - React - 根据查询字符串参数值有条件地显示块
- c# - 多个 Linq 函数作为参数
- vue.js - 如何在组件和状态中维护相似的变量名 - VUEJS?
- node.js - 如何使用 azure 函数处理流数据?