ORDER BY 货币值
ORDER BY for currency values
我在其中一个 MySQL 表中有一个 prize_value 列,现在我需要根据它进行排序。该列实际上是 VARCHAR,并附有货币符号。但不是所有的价值观。货币符号可以是 USD(美元符号)、POUND 或 INR(卢比符号)。所以目前 order by 不能正常工作。如何在不手动删除货币符号的情况下解决此问题?
列中有一些示例值:
.50
£10
£100
£25
£50
10
₹30
您需要两列:
- 一个为值,一个float/double(或整数)可以排序,用于求和等操作
- 一个用于货币(ISO 4217 standard 后的一个 char(3))用于其他目的(显示,可能转换等)
将值和符号都存储在 varchar 中是没有意义的,特别是因为货币符号的位置因国家/地区而异(可以在开头或结尾),可能 space 符号与数值之间,或不等
话虽如此,如果您不想更改 table,类似的方法可能会奏效:
ORDER BY CAST(
REPLACE(REPLACE(REPLACE(thecolumn,'$',''),'£',''),'₹','')
AS DECIMAL(10,2)
)
这对我有用...
我创建了一个包含大约 15 行的 table,一些包含字符($、£、€),一些不包含。我创建了一个 CAST 为 DECIMAL 的计算字段,然后我检查最左边的字符以查看它是否可以转换为数字,如果可以,我们检查最右边的字符,因为某些货币将符号放在末尾。如果右边的字符 > 0,我们使用 prize_value,否则我们取左边的字符。回到第一个 IF 语句,如果它不大于 0,则意味着它要么以 0 开头(这无关紧要),要么它是一个非数字(在本例中是货币符号),所以我们取最右边的文字。最后我们关闭 CAST 字段并按它排序。您可以将其作为计算字段或 ORDER BY。我把它放在下面。
SELECT prize_value,
CAST(IF(LEFT(test.prize_value,1) IN ('.',','),
REPLACE(test.prize_value,LEFT(test.prize_value,1),'0.'),
IF(CAST(LEFT(test.prize_value, 1) AS DECIMAL(10,2)) > 0,
IF(CAST(RIGHT(test.prize_value, 1) AS DECIMAL(10,2)) > 0,
test.prize_value,
LEFT(test.prize_value, LENGTH(test.prize_value) - 1)
),
RIGHT(test.prize_value, LENGTH(test.prize_value) - 1)
)
)
AS DECIMAL(10,2)) AS prize_value_only
FROM chatter.test
ORDER BY prize_value_only ASC
--- 或 ---
SELECT prize_value
FROM chatter.test
ORDER BY
CAST(IF(LEFT(test.prize_value,1) IN ('.',','),
REPLACE(test.prize_value,LEFT(test.prize_value,1),'0.'),
IF(CAST(LEFT(test.prize_value, 1) AS DECIMAL(10,2)) > 0,
IF(CAST(RIGHT(test.prize_value, 1) AS DECIMAL(10,2)) > 0,
test.prize_value,
LEFT(test.prize_value, LENGTH(test.prize_value) - 1)
),
RIGHT(test.prize_value, LENGTH(test.prize_value) - 1)
)
) AS DECIMAL(10,2)) ASC
我在其中一个 MySQL 表中有一个 prize_value 列,现在我需要根据它进行排序。该列实际上是 VARCHAR,并附有货币符号。但不是所有的价值观。货币符号可以是 USD(美元符号)、POUND 或 INR(卢比符号)。所以目前 order by 不能正常工作。如何在不手动删除货币符号的情况下解决此问题?
列中有一些示例值:
.50
£10
£100
£25
£50
10
₹30
您需要两列:
- 一个为值,一个float/double(或整数)可以排序,用于求和等操作
- 一个用于货币(ISO 4217 standard 后的一个 char(3))用于其他目的(显示,可能转换等)
将值和符号都存储在 varchar 中是没有意义的,特别是因为货币符号的位置因国家/地区而异(可以在开头或结尾),可能 space 符号与数值之间,或不等
话虽如此,如果您不想更改 table,类似的方法可能会奏效:
ORDER BY CAST(
REPLACE(REPLACE(REPLACE(thecolumn,'$',''),'£',''),'₹','')
AS DECIMAL(10,2)
)
这对我有用...
我创建了一个包含大约 15 行的 table,一些包含字符($、£、€),一些不包含。我创建了一个 CAST 为 DECIMAL 的计算字段,然后我检查最左边的字符以查看它是否可以转换为数字,如果可以,我们检查最右边的字符,因为某些货币将符号放在末尾。如果右边的字符 > 0,我们使用 prize_value,否则我们取左边的字符。回到第一个 IF 语句,如果它不大于 0,则意味着它要么以 0 开头(这无关紧要),要么它是一个非数字(在本例中是货币符号),所以我们取最右边的文字。最后我们关闭 CAST 字段并按它排序。您可以将其作为计算字段或 ORDER BY。我把它放在下面。
SELECT prize_value,
CAST(IF(LEFT(test.prize_value,1) IN ('.',','),
REPLACE(test.prize_value,LEFT(test.prize_value,1),'0.'),
IF(CAST(LEFT(test.prize_value, 1) AS DECIMAL(10,2)) > 0,
IF(CAST(RIGHT(test.prize_value, 1) AS DECIMAL(10,2)) > 0,
test.prize_value,
LEFT(test.prize_value, LENGTH(test.prize_value) - 1)
),
RIGHT(test.prize_value, LENGTH(test.prize_value) - 1)
)
)
AS DECIMAL(10,2)) AS prize_value_only
FROM chatter.test
ORDER BY prize_value_only ASC
--- 或 ---
SELECT prize_value
FROM chatter.test
ORDER BY
CAST(IF(LEFT(test.prize_value,1) IN ('.',','),
REPLACE(test.prize_value,LEFT(test.prize_value,1),'0.'),
IF(CAST(LEFT(test.prize_value, 1) AS DECIMAL(10,2)) > 0,
IF(CAST(RIGHT(test.prize_value, 1) AS DECIMAL(10,2)) > 0,
test.prize_value,
LEFT(test.prize_value, LENGTH(test.prize_value) - 1)
),
RIGHT(test.prize_value, LENGTH(test.prize_value) - 1)
)
) AS DECIMAL(10,2)) ASC