在&sql中排序值"数字/数字/数字:

时间:2015-09-08 20:54:55

标签: sql sql-server-2008

我将/分隔的数字数据作为字符串,类似于日期字符串,如:

('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 Fiddle

1 个答案:

答案 0 :(得分:0)

如果您使用的是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 =&gt; 123.45.678 =&gt; 678,45,123。然后我根据需要使用这些部件来订购结果! (这不是最干净的解决方案,但可以满足这种有限的要求。)