假设我有一个user
表,记录如下:
----------------------
| User ID | Username |
----------------------
|US1 | Andy |
|US2 | Boston |
|US3 | Charlie |
|US4 | Donnie |
|US5 | Elmo |
|US6 | Frank |
|US7 | Garry |
|US8 | Henry |
|US9 | Ignatius |
|US10 | John |
我需要的是
US10 | John
然后我这样做:
SELECT MAX (UserId) FROM User;
结果是
US9 | Ignatius
因为它按字面顺序排序,所以US10不是最大值
我应该怎么做才能完成这个结果? 提前谢谢。
答案 0 :(得分:1)
如果你有固定的数据格式,比如数字最后是字符串,那么你可以使用PATINDEX()函数从字符串中获取数字
SELECT TOP 1 * FROM [User]
ORDER BY CAST(SUBSTRING(UserId, PATINDEX('%[0-9]%', UserId), LEN(UserId)) AS INT) DESC;
如果您没有固定字符串中的数字格式,并且您只想根据数字对数据进行排序,请查看以下链接中的更多详细信息
<强> SQL Server 2008 - order by strings with number numerically 强>
答案 1 :(得分:0)
假设您的列格式在开头始终具有相同的字符数量,您可以使用此查询删除前2个字符并将剩余字符转换为数字,以便在最大查询中获得正确的行为:
SELECT MAX(CAST(SUBSTRING(`UserId` FROM 3) AS UNSIGNED)) FROM `User` ;
答案 2 :(得分:0)
尝试此查询
SELECT TOP 1 * FROM User ORDER BY CAST(RIGHT(UserId,LEN(UserId)-2) AS INT) DESC
OP
US10 |约翰
答案 3 :(得分:0)
注意:请记住user
是sql中的保留字,因此应该在[user]
有很多选择:
1)
select top 1 Userid,
CAST(SUBSTRING(UserId, PATINDEX('%[0-9]%', UserId), LEN(UserId)) AS INT) as Maxid,
username
from [user]
Order By Maxid desc
输出:
Userid Maxid username
=============================
US10 10 John
2)
SELECT TOP 1 * FROM [User]
ORDER BY CAST(RIGHT(UserId,LEN(UserId)-2) AS INT) DESC
输出
userid username
=====================
US10 John