栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在SQL Server中将字符串排序为数字

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在SQL Server中将字符串排序为数字

明智地使用的

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))
很多。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373910.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号