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