我得到的桌面价格与以下类似:
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
还在尝试其他变化...
答案 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