MySQL货币格式查询
MySQL query on money format
我得到了一个 table 价格,其值类似于以下内容:
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
仍在尝试其他变体...
SELECT price, CONVERT(REPLACE(REPLACE(price, ",", ""), ".", ""),UNSIGNED INTEGER) formattedPrice
FROM testtest
ORDER BY formattedPrice;
这应该有效。
说明:
您将数字作为字符串保存在数据库中。删除除数字以外的所有内容并将其转换为无符号整数即可解决您的问题。
您的价格似乎是文本字符串(可能存储在 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
我得到了一个 table 价格,其值类似于以下内容:
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
仍在尝试其他变体...
SELECT price, CONVERT(REPLACE(REPLACE(price, ",", ""), ".", ""),UNSIGNED INTEGER) formattedPrice
FROM testtest
ORDER BY formattedPrice;
这应该有效。
说明: 您将数字作为字符串保存在数据库中。删除除数字以外的所有内容并将其转换为无符号整数即可解决您的问题。
您的价格似乎是文本字符串(可能存储在 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