SQL Sort / Cast最后五个字符问题

时间:2010-07-07 18:59:41

标签: sql sql-server tsql

我有一个棘手的SQL问题,我不是最好的SQL ...

我有一个包含varchar(40)列的表,其中包含以下两种格式的数据:

nn-nnn1nnn00000
nn-nnn-nnn-0000

第二种数据类型已过时;然而,因为它们已经过时,所以需要先按顺序查看。建议我对该行的最后5个字符进行子字符串,然后将其转换为数字然后,如果-0000变为负数,则较旧的字符将首先排序。我不确定这是否会奏效......

正常排序的问题是因为你可以看到新的是第7位的数字。因此,当我尝试排序时,我得到:

nn-nnn-nnn-0001
nn-nnn-nnn-0002
nn-nnn-nnn-0003
nn-nnn1nnn00002 <-Should be 5th
nn-nnn2nnn00003 <-Should be 6th
nn-nnn3nnn00001 <-Should be 4th

因为这是针对asp .net页面的,我正在考虑使用数据表做一些疯狂的事情,但我知道这更适合由SQL Server处理。

有没有办法以最后五个字符排序的方式对最后五个字符进行排序,同时仍然允许新的字符正确排序?

真的不想在数据表中做一些奇怪的事情......

万分感谢!!!

3 个答案:

答案 0 :(得分:4)

我会尝试这样的事情(虽然它可能被认为是笨重的):

Select
  Col, Case Left(Right(Col, 5), 1) When '-' Then 0 Else 1 End As Old
From
  Table
Order By
  Old, Col

答案 1 :(得分:3)

右5个字符&amp; Cast as Integer完美地工作(修改后!!)

检查出来..

With MyTable AS
(
SELECT 'nn-nnn-nnn-0001' as MyData
UNION SELECT 'nn-nnn-nnn-0002'
UNION SELECT 'nn-nnn-nnn-0003'
UNION SELECT 'nn-nnn1nnn00002'
UNION SELECT 'nn-nnn2nnn00003'
UNION SELECT 'nn-nnn3nnn00001'
)
SELECT *
FROM MYTable
ORDER BY CASE WHEN SUBSTRING (MyData, 11, 1) = '-' THEN 0 ELSE 1 END, 
    CAST (REPLACE (RIGHT (MyData, 5), '-', 0) AS INTEGER)

MyData
---------------
nn-nnn-nnn-0001
nn-nnn-nnn-0002
nn-nnn-nnn-0003
nn-nnn3nnn00001
nn-nnn1nnn00002
nn-nnn2nnn00003

(6 row(s) affected)

答案 2 :(得分:1)

您可以创建计算列,使用确定性用户定义函数来为该列创建索引并使用该列进行排序。

编辑:我只是要澄清一下,但我不确定这对你来说是不是很奇怪!