繁体   English   中英

排序值如“数字/数字/数字:在 sql 中

[英]Sort value like "number/number/number: in sql

我已经/分隔的数值数据为字符串,类似日期字符串,如:

('95/05/13'), ('900/04/15'), ('89/05/15'), ('189/07/15')

我需要ORDER BY年份(第三部分)然后按月份(第二部分)和最后一天/数字(第一部分)按以下顺序订购:

('189/07/15'), ('89/05/15'), ('900/04/15'), ('95/05/13')

我正在使用 SQL Server 2008。

我试过:

CASE 
    WHEN PatIndex('%[/]%',invoiceid) > 0
      THEN LEFT(invoiceid, PatIndex('%[/]%', invoiceid) - 1)
      ELSE invoiceid 
END * 1 DESC,
CASE 
    WHEN PatIndex('%[/]%',REVERSE(invoiceid)) > 0
      THEN RIGHT(invoiceid, PatIndex('%[/]%', REVERSE(invoiceid)) - 1)
      ELSE NULL 
END * 1 DESC

但它只给我基于第一个数字的结果。

SQL小提琴

如果您使用的是 SQL Server,则可以使用类似

select * from [YourTable]
order by PARSENAME(REPLACE([YourColumn], '/', '.'), 1) desc, 
        PARSENAME(REPLACE([YourColumn], '/', '.'), 2) desc, 
        PARSENAME(REPLACE([YourColumn], '/', '.'), 3) desc

更新:这是我刚刚在你的小提琴(SQL Server 2008)中运行的

SELECT invoiceid FROM Invoice
ORDER BY PARSENAME(REPLACE([invoiceid], '/', '.'), 1) desc, 
        PARSENAME(REPLACE([invoiceid], '/', '.'), 2) desc, 
        PARSENAME(REPLACE([invoiceid], '/', '.'), 3) desc

PARSENAME应该用于解析对象名称并检索服务器名称、数据库名称等。但是,基本上它的作用是,它被 '.' 分割。 并以相反的顺序给出各部分(最后一部分...第一部分)。 它最多只能拆分为四个部分!

在这里,我所做的是,将“/”替换为“.”,然后使用 parsename 拆分字符串。 例如 123/45/678 => 123.45.678 => 678, 45, 123。然后我使用这些部分按要求对结果进行排序! (这可能不是最干净的解决方案,但适用于这种有限的要求。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM