我在Postgres中有一个带小数字段的表 该字段的值为39.95
我尝试创建一个SQL-Query来获取值为39.95的所有记录
这是我的代码:
SELECT CR_Sale.id , CR_Sale.sale_date, ROUND(CR_Sale.sale_bruto_total, 2)
AS sale_bruto_total, CR_Sale.sale_ticket
FROM crm_CR_Sale CR_Sale
WHERE sale_bruto_total = 39.95
ORDER BY sale_timestamp DESC;
执行查询时,未找到任何结果。 如果我将代码更改为
WHERE sale_bruto_total <= 39.95
我得到一个结果,可以看到值为39.95的记录
我做错了什么? 感谢
答案 0 :(得分:2)
尝试如下: -
SELECT CR_Sale.id , CR_Sale.sale_date, ROUND(CR_Sale.sale_bruto_total, 2)
AS sale_bruto_total, CR_Sale.sale_ticket
FROM crm_CR_Sale CR_Sale
WHERE sale_bruto_total = CAST(39.95 AS dec(5,2))
ORDER BY sale_timestamp DESC;
注意: - &#39; sale_bruto_total&#39;列应为十进制类型
答案 1 :(得分:0)
数字39.95
不是decimal
值而是float
,然后由于float
s的内部精度,您无法进行相等比较(这是首先存在decimal
数据类型的原因)所以你必须添加一个显式的强制转换:
sale_bruto_total = 39.95::decimal(5,2)
此外,如果sale_bruto_total
的值正好 39.95
,因为该字段被定义为点后面带有两位小数的decimal
,那么你可以不需要选择列表中的round()
函数。另一方面,如果有更多的小数,那么你也需要在过滤器中使用round()
函数。所以:
SELECT id, sale_date, round(sale_bruto_total, 2) AS sale_bruto_total, sale_ticket
FROM crm_CR_Sale
WHERE round(sale_bruto_total, 2) = 39.95::decimal(5,2)
ORDER BY sale_timestamp DESC;
或
SELECT id, sale_date, sale_bruto_total, sale_ticket
FROM crm_CR_Sale
WHERE sale_bruto_total = 39.95::decimal(5,2)
ORDER BY sale_timestamp DESC;