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 when
将 decimal
转换为 varchar
,并且 creditLimit
被比较为 varchar
s:
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;
我有一个 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 when
将 decimal
转换为 varchar
,并且 creditLimit
被比较为 varchar
s:
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;