SQL-Select,十进制字段不起作用

时间:2015-10-26 06:13:47

标签: sql postgresql decimal

我在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的记录

我做错了什么? 感谢

2 个答案:

答案 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;