明智地使用的
REVERSE,
CHARINDEX以及
SUBSTRING,可以得到我们想要的东西。我在下面的代码中使用了希望说明的列名来说明正在发生的事情。
设置样本数据:
DECLARE @Invoice TABLE ( InvoiceNumber nvarchar(10));INSERT @Invoice VALUES('790711'),('790709-1'),('790709-11'),('790709-21'),('790709-212'),('790709-2')SELECt * FROM @Invoice样本数据:
InvoiceNumber-------------790711790709-1790709-11790709-21790709-212790709-2
这是代码。我有一个the的感觉,可以简化最终的表达方式。
SELECt InvoiceNumber ,REVERSe(InvoiceNumber) AS Reversed ,CHARINDEX('-',REVERSe(InvoiceNumber)) AS HyphenIndexWithinReversed ,SUBSTRINg(REVERSe(InvoiceNumber),1+CHARINDEX('-',REVERSe(InvoiceNumber)),LEN(InvoiceNumber)) AS ReversedWithoutAffix ,SUBSTRINg(InvoiceNumber,1+LEN(SUBSTRINg(REVERSe(InvoiceNumber),1+CHARINDEX('-',REVERSe(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber)) AS AffixIncludingHyphen ,SUBSTRINg(InvoiceNumber,2+LEN(SUBSTRINg(REVERSe(InvoiceNumber),1+CHARINDEX('-',REVERSe(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber)) AS AffixExcludingHyphen ,CAST( SUBSTRINg(InvoiceNumber,2+LEN(SUBSTRINg(REVERSe(InvoiceNumber),1+CHARINDEX('-',REVERSe(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber)) AS int) AS AffixAsInt ,REVERSe(SUBSTRINg(REVERSe(InvoiceNumber),1+CHARINDEX('-',REVERSe(InvoiceNumber)),LEN(InvoiceNumber))) AS WithoutAffixFROM @InvoiceORDER BY -- WithoutAffix REVERSe(SUBSTRINg(REVERSe(InvoiceNumber),1+CHARINDEX('-',REVERSe(InvoiceNumber)),LEN(InvoiceNumber))) -- AffixAsInt ,CAST( SUBSTRINg(InvoiceNumber,2+LEN(SUBSTRINg(REVERSe(InvoiceNumber),1+CHARINDEX('-',REVERSe(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber)) AS int)输出:
InvoiceNumber Reversed HyphenIndexWithinReversed ReversedWithoutAffix AffixIncludingHyphen AffixExcludingHyphen AffixAsInt WithoutAffix------------- ---------- ------------------------- -------------------- -------------------- -------------------- ----------- ------------790709-1 1-907097 2 907097 -1 1 1790709790709-2 2-907097 2 907097 -2 2 2790709790709-11 11-907097 3 907097 -11 11 11 790709790709-21 12-907097 3 907097 -21 21 21 790709790709-212 212-907097 4 907097 -212 212 212 790709790711 117097 0 117097 0790711
请注意,您实际需要的只是该
ORDER BY子句,其余的只是为了展示我的工作,它是这样的:
- 反转字符串,找到连字符,获取连字符后的子字符串,反转该部分:这是没有任何缀名的数字
- 的长度(不带任何后缀的数字)告诉我们从一开始要删除多少个字符,以便获得包括连字符在内的后缀。放置一个附加字符以获取数字部分,然后将其转换为
int
。幸运的是,我们与SQL Server有所不同,该转换为空字符串提供了零。 - 最后,在获得了这两部分之后,我们简单地进行操作
ORDER BY
(不带任何后缀的数字),然后乘以(后缀的数字值)。这是我们寻求的最终订单。
如果SQL Server允许我们说
SUBSTRINg(value,start)从那时开始获取字符串,则代码将更加简洁,但是事实并非如此,因此我们不得不说
SUBSTRINg(value, start,LEN(value))很多。



