【问题标题】:Custom sql sort自定义sql排序
【发布时间】:2014-04-29 21:02:39
【问题描述】:

我是 SQL 新手.. 我想对一列进行排序,该列的值将是 示例:D2V2PRT1,D1V2PRT2,D2V1PRT1,D1V1PRT3......

我想要排序输出为

D1V1PRT3,
D1V2PRT2,
D2V1PRT1,
D2V2PRT1,......

所以排序应该是这样的,首先它会对 D 值排序,然后对 V 值排序,然后对 PRT 值排序,所有值都在字符串中。

我已经编写了一些逻辑并且能够将值从 D V 和 PRT 中分离出来,所以现在我的问题是如何按顺序指定它

提前致谢

【问题讨论】:

  • 数字可以超过9吗?此外,发布分隔 D V PRT 值的逻辑。
  • 不,所有都将按 Asc 排序,是的,那些没有的没有限制
  • @Andomar 用于在 D CAST(substring(PRT.DisplayID,(CHARINDEX('D',PRT.DisplayID)+1),(CHARINDEX('V',PRT.DisplayID)- (CHARINDEX('D',PRT.DisplayID)+1))) 作为数字)逻辑使用 ,, 对于 V 值 CAST(substring(PRT.DisplayID,(CHARINDEX('V',PRT.DisplayID)+1), (CHARINDEX('PRT',PRT.DisplayID)-CHARINDEX('V',PRT.DisplayID)-1)) as numeric) asc 和 PRT CAST(substring(PRT.DisplayID,(CHARINDEX('PRT',PRT. DisplayID)+3),len(PRT.DisplayID)) as numeric) asc 使用上述逻辑可以得到 nos

标签: sql sql-server sql-server-2008 sorting


【解决方案1】:

您可以使用charindex 提取数字:

declare @t table (id varchar(100));
insert @t values ('D1V1PTR1'), ('D100V1PTR1'), ('D1V8PTR5'), ('D1V40PTR10');

; with  extracted as
        (
        select  substring(id, 2, charindex('V', id)-2) as D
        ,       substring(id, charindex('V', id)+1, 
                              charindex('PTR', id)-charindex('V', id)-1) as V
        ,       substring(id, charindex('PTR', id)+3, 100) as PTR
        from    @t
        )
select  *
from    extracted
order by
        cast(d as bigint)
,       cast(v as bigint)
,       cast(ptr as bigint)

Example at SQL Fiddle.

如您所见,SQL 并不是解析字符串的最佳语言。 :)

【讨论】:

  • 因为我是这个网站的新手,所以它不允许我将你的答案标记为正确的答案。对不起
  • @Jaydeeprony89 无论声誉如何,您都应该能够接受答案,但是您不能投票直到 15 声誉。
【解决方案2】:

您使用ORDER BY SUBSTRING(...) 对部分字符串进行排序,如下所示:

order by substring(val, 1, 2), substring(val, 3, 2), substring(val, 5, 4)

这假定 D 和 V 字段是两个字符长,PRT 是四个字符,并按字符字符串(D1V1等)排序,而不是数值,这可能不正确,但作为你已经有了分割字符串的逻辑,它应该很容易调整。

【讨论】:

  • D1V14PRT11 D1V14PRT9 D1V19PRT26 D1V14PRT1 D1V14PRT6 D1V14PRT23 D1V14PRT13 D1V14PRT2 D1V14PRT22 D11V15PRT15 D189V19PRT7 D1V14PRT14 D1V14PRT7 D1V14PRT5 D1V14PRT4 D189V18PRT12 D1V14PRT3 D189V19PRT9 D1V14PRT10 D1V14PRT24 D1V22PRT27 D1V14PRT20 D1V14PRT8 D1V14PRT19 D1V14PRT12 D1V14PRT25 D1V14PRT18 D184V10PRT3 D188V14PRT2 D189V19PRT6 D1V14PRT21 D189V19PRT8 D23V11PRT1 D189V18PRT11 D1V14PRT17 D189V18PRT4 D189V18PRT5 D1V14PRT16 D189V19PRT10这是我的专栏样本,我希望它根据 DascnoVascnoPRTascno 进行排序
  • @Jaydeeprony89 由于字符串中各部分的长度可能不同,您必须使用一些自定义逻辑来提取它们。看看Andomar发布的答案
  • 是的,我能够提取 D V 和 PRT 之后的值,但是按照我需要提到的顺序?
  • @Jaydeeprony89 Andomars 的答案可能就是你想要的。
  • 是的,知道了.. 甚至我也差点到达那里,但是是的,Andomar 是我在寻找的东西
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2014-06-30
  • 2019-12-06
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多