我的表中有以下值:
ABC
ABC1
ABC2
ABC3 and so on...
ABC11
ABC12
ABC13 and so on..
ABC20
ABC21
ABC22 and so on..
所以基本上我得到的是任何字符串值(不总是ABC,任何字符串值),它可以跟数字,也可以只是一个没有数字的字符串。
当我选择 * 从表顺序按我的列升序我得到以下结果:
ABC
ABC1
ABC11
ABC12
ABC13
ABC2
ABC20
ABC21
ABC22
ABC3
ABC31
ABC32
我需要按数字排序:
ABC
ABC1
ABC2
ABC3
ABC11
ABC12
ABC13
ABC20
ABC21
ABC22
ABC31
ABC32
如何才能做到这一点?
7条答案
按热度按时间lstz6jyr1#
您可以使用PATINDEX()函数执行此操作,如下所示:
SQL Fiddle演示
如果字符串中间有数字,则需要创建一个小的用户定义函数,以从字符串中获取数字,并基于该数字对数据进行排序,如下所示:
您可以按以下方式对数据进行排序:
vuktfyat2#
下面是我所说的“干净的黑客”。假设你在
Col1
列上订购:这是一个黑客,虽然我个人感到自豪使用它。
sshcrbum3#
在order by语句中,当值中包含任何数字时,请在前面加上足够多零,以使所有字母数字值长度相同
piah890a4#
您可以删除前三个字符,并将其余字符转换为
int
演示版
41ik7eoe5#
您可以修改this answer中的函数 RemoveNonAlphaCharacters,以过滤掉除数字以外的所有内容,然后使用
ORDER BY
来使用该函数。eivnm1vs6#
此查询仅使用标准SQL说明如何按ODER BY对字符串开头或结尾包含的数字进行排序。此查询还说明如何查看字符串的其余“内部”部分,以查看其中是否包含任何数字。如果需要进一步处理,了解字符串中是否包含数字将非常有用。
jc3wubiy7#
下面是一个简单易懂的示例,适用于SQL Server 17+的使用者。
退货
SQL Server的TRANSLATE采用三个参数:
inputString, characters, translations
.在本例中,
inputString
是列名。characters
是要替换的值,在本例中是字母表。translations
是要替换的值。该字符串的长度必须等于characters
--因此空字符串的长度为26个空格。最后,使用
CAST
忽略空格,并允许将剩余的值作为int进行排序。您可以在此处阅读有关TRANSLATE的信息:
https://learn.microsoft.com/en-us/sql/t-sql/functions/translate-transact-sql?view=sql-server-ver15