MySQL查询货币格式

时间:2015-04-26 11:07:39

标签: php mysql pdo mysqli

我得到的桌面价格与以下类似:

price
----------- 
21,781.00
27,615.00
46,565.00
46,565.00
48,565.00
571.00
830.00
0.00

通过查询:

SELECT * FROM tprice ORDER BY price=0, convert(price, decimal) ASC

我得到以下结果:

21,781.00
27,615.00
46,565.00
46,565.00
48,565.00
571.00
830.00

并且,执行此查询:

SELECT * FROM tprice ORDER BY price=0, convert(price, decimal) DESC

我得到了

830.00
571.00
48,565.00
46,565.00
46,565.00
27,615.00
21,781.00
0.00

为什么没有正确订购830.00和571.00?

编辑:

我已将查询更改为:

SELECT * FROM tprice ORDER BY price=0, replace(',','',price), price ASC

似乎工作“好一点”。结果:

830.00
571.00
48,565.00
46,565.00
46,565.00
27,615.00
21,781.00
0.00

还在尝试其他变化...

2 个答案:

答案 0 :(得分:1)

SELECT price, CONVERT(REPLACE(REPLACE(price, ",", ""), ".", ""),UNSIGNED INTEGER) formattedPrice
FROM testtest
ORDER BY formattedPrice;

这应该有用。

说明: 您将数字保存为数据库中的字符串。删除除数字之外的所有内容并将其转换为unsigned int可以解决您的问题。

答案 1 :(得分:1)

您的价格似乎是文本字符串(可能存储在VARCHAR(nn)列中),其中包含数千个分隔符的美式逗号和小数分隔符的点。

但它们是货币价值。您希望将它们视为DECIMAL(15,2)或某种此类数据格式。

如果你这样做

 ORDER BY CONVERT(REPLACE(price,',',''), DECIMAL(15,2))

在SQL语句结束时,您将获得所需的排序顺序。这将删除逗号,然后将剩余的字符串转换为十进制。

请注意,在尝试对这些值进行算术运算之前,也应该执行此转换。例如,你应该做

SELECT CONVERT(REPLACE(price,',',''), DECIMAL(15,2)) AS price,
       CONVERT(REPLACE(price,',',''), DECIMAL(15,2)) * units AS total_price

如果您将价格乘​​以单位。

建议更改数据库结构的注释是正确的,但您可以使用这些转换来解决有缺陷的数据库设计。

这是一个封装转换的存储函数。

DELIMITER $$
DROP FUNCTION IF EXISTS STRING2DECIMAL$$
CREATE FUNCTION STRING2DECIMAL(input VARCHAR(255)
     ) RETURNS DECIMAL(15,2)
    NO SQL
    DETERMINISTIC
    BEGIN
    RETURN CONVERT(REPLACE(input,',',''), DECIMAL(15,2));
END$$
DELIMITER ;

如果您定义了这个,那么您可以编写像

这样的查询
SELECT STRING2DECIMAL(price) AS price,
       STRING2DECIMAL(price) * units AS total_price
  FROM stock
 ORDER BY total_price DESC

更容易阅读。这意味着你的工作更容易。

最后,如果要放回数千个分隔符进行显示,请使用FORMAT函数。

SELECT FORMAT(STRING2DECIMAL(price) * units, 2) AS total