如何以下列方式在SQL Server中订购列?

时间:2016-05-03 19:08:20

标签: sql-server

我正在尝试按数据类型为nvarchar的列进行排序。我的列数据如下所示:

9 AM - 11 AM
1 PM - 3 PM
11 AM - 1 PM
3 PM - 5 PM
5 PM - 7 PM

我想以这种方式通过我的专栏订购:

9 AM - 11 AM
11 AM - 1 PM
1 PM - 3 PM
3 PM - 5 PM
5 PM - 7 PM

我该怎么做?

3 个答案:

答案 0 :(得分:0)

您可以创建一个变量,其中包含您希望按数据中未出现的字符分隔的排序顺序中的项目。当我使用波浪号("〜")字符之前完成此操作时。它看起来像这样......

DECLARE @CustomSortOrder VARCHAR(100)

SET @CustomSortOrder = '9 AM - 11 AM~11 AM - 1 PM~1 PM - 3 PM~3 PM - 5 PM~5 PM - 7 PM~'

SELECT *
FROM [YourTable]
ORDER BY CHARINDEX([YourTable].[YourColumn] + '~', @CustomSortOrder)

对于这种情况,您可能没有波形符分隔符。但是,无论如何,我都喜欢它以提高可读性。

答案 1 :(得分:0)

请注意,这不会有效并且非常容易出错 - 您应该认真考虑将这些值存储为实时。 我使用一个表变量和一个名为[timen]的列来存储您的值。 获取倒数第二个字符的ASCII值,并将其添加到字符串中空格的剩余值:

    DECLARE @timetable TABLE(timen nvarchar(5));
    INSERT INTO @timetable(timen)
        VALUES ('9 AM'), ('11 AM'), ('1 PM'), ('3 PM'), ('11 AM'), ('1 PM'), ('3 PM'), ('5 PM'), ('5 PM'), ('7 PM');
    SELECT  t.timen
    FROM    @timetable t
    ORDER BY LEFT(t.timen, (PATINDEX('% %', t.timen) - 1)) + ASCII(SUBSTRING(RIGHT(t.timen, 2), 1, 1));

答案 2 :(得分:0)

试试这个,

declare @t1 table(col1 varchar(50))
insert into @t1 values
('9 AM - 11 AM')
,('1 PM - 3 PM')
,('11 AM - 1 PM')
,('3 PM - 5 PM')
,('5 PM - 7 PM')
SELECT row_number() OVER (
        ORDER BY cast(substring(col1, 0, charindex('-', col1)) AS TIME)
        ) rn
    ,col1
FROM @t1