MySQL - 如何比较从 CASE WHEN 返回的 varchar 小数?

MySQL - How to compare varchar decimals returned from CASE WHEN?

我有一个 sql,我想先按 country 排序,然后每个 country 都有自己的排序规则。

这是我的 sql:

select country, state, creditLimit, salesRepEmployeeNumber, customerNumber from customers
order by field(country, 'UK', 'france', 'USA') desc,
(
case when country = 'USA' then state
    when country = 'UK' then salesRepEmployeeNumber
    when country  = 'france' then creditLimit
    else customerNumber
end
);

问题是,creditLimit 的类型是 decimal。但是看起来 case whendecimal 转换为 varchar,并且 creditLimit 被比较为 varchars:

118200.00
123900.00
 21000.00
 53800.00
 61100.00
 65000.00
 68100.00
 77900.00
 81100.00
 82900.00
 84300.00
 95000.00

我考虑过将 varchars 转换回十进制,但如果不是法国,则不应将它们作为小数进行比较。

如何解决这个问题?另外,我怎样才能按降序对法国的 decimalLimit 进行排序?

这里的问题是您试图按单个 CASE 表达式排序,但有时您想要使用文本列,有时您想要使用小数列。您不能制作state十进制,但您可以制作十进制文本。因此,这里的一种方法是将 creditLimit 十进制列转换为文本,并用零填充它,以便它正确排序为文本:

SELECT country, state, creditLimit, salesRepEmployeeNumber,
       customerNumber
FROM customers
ORDER BY
    FIELD(country, 'UK', 'france', 'USA') DESC,
    CASE country WHEN 'USA'    THEN state
                 WHEN 'UK'     THEN salesRepEmployeeNumber
                 WHEN 'france' THEN LPAD(creditLimit, 13, '0')
                 ELSE customerNumber END;