如何在MySQL中像整数一样排序字符串值

4

image

请检查上述结果输出。正如您所看到的,在DT-10之后,它显示出DT-100。但是我需要显示DT-12而不是DT-100。我已经尝试了两种方法,但结果都一样。

第一次尝试

SELECT *
FROM fas_details
WHERE equipment_no LIKE 'DT%'
ORDER BY CAST(equipment_no AS DECIMAL(10,2))

第二次尝试

SELECT *
FROM fas_details
WHERE equipment_no LIKE 'DT%'
ORDER BY equipment_no * 1 ASC, equipment_no ASC

已经检查了以下问题:


1
“equipment_no” 是否总是以 “DT - *” 格式出现? - A J
是的,@AJ。它总是以相同的格式出现。 - sutin_martin
4个回答

2

equipment_no 是一个字符串,按照特定格式排列。你需要提取破折号后面的整数部分,并隐式转换为整数再排序:

SELECT *
FROM fas_details
WHERE equipment_no LIKE 'DT%'
ORDER BY SUBSTRING_INDEX(equipment_no, '-', -1) + 0

1
感谢您抽出时间添加这个答案,它很有效。 - sutin_martin

2

设备编号是否总是以DT-*的格式呈现?

是的,@AJ。它总是以相同的格式呈现。

equipment_no中的数字将被视为字符串并根据此基础进行排序。您必须提取这些数字。您可以使用SUBSTRING_INDEX来实现这个目的,然后将结果转换为整数以进行排序。

SELECT *
FROM fas_details
WHERE equipment_no LIKE 'DT%'
ORDER BY CAST(SUBSTRING_INDEX(equipment_no, '-', -1) AS UNSIGNED) ASC;

0
我们可以在这里使用SUBSTRING_INDEX,但在排序之前我们还必须将输出转换为整数:
SELECT *
FROM fas_details
WHERE equipment_no LIKE 'DT%'
ORDER BY CAST(SUBSTRING_INDEX(equipment_no, ' - ', -1) AS UNSIGNED);

感谢您抽出时间添加这个答案,它很有效。 - sutin_martin
我也尝试使用 Trim 但似乎并不必要。 - A J

0
在对“equipment_no”的一部分进行排序时,您还需要注意数字之前的字母和数字混合部分。
例如,如果有类似于“ET - 0”和“ET - 9”的值,那么在输出结果中,“ET - 9”不应该排在前面。
| ET - 0       |
| DT - 01      |
| DT - 02      |
| DT - 03      |
| DT - 04      |
| ET - 9       |
| DT - 10      |

这将更正确地排序:

select * from equipment 
order by 
  substring_index(equipment_no,'-',1), 
  cast(trim(substring_index(equipment_no,'-',-1)) as unsigned);

输出:

| DT - 100     |
| DT - 101     |
| DT - 102     |
| ET - 0       |
| ET - 9       |

最后一句话,如果有很多记录,这样排序会很慢,因为必须获取选择中的每个记录以获取排序顺序!

感谢您抽出时间添加这个答案,它很有效。 - sutin_martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接