按字符串的一部分排序

时间:2012-04-21 14:34:37

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

基本上我有一个像这个例子的表“歌曲”。

enter image description here

我需要获取数据并在gridview中显示。桌子很乱,歌曲可以按任​​何顺序排列,不一定按专辑或歌手分组。我需要先按歌手对行进行排序,它应按字母顺序对艺术家进行排序。专辑也应该分组。但更重要的是,歌曲应按字母顺序/或按数字顺序排序。

上表显示了我想要的理想排序列表。任何人都可以指出如何为此编写T-SQL。我正在使用SQL Server 2008 R2。

3 个答案:

答案 0 :(得分:1)

select  *
from    Songs
order by
        Singer
,       Album
,       Title

答案 1 :(得分:1)

您需要选择是否要按字母顺序排列相册中的歌曲(不太可能是恕我直言)或按数字排序(更有可能,因为我不希望以任何顺序收听月球的黑暗面初衷)。正如我在上面的评论中提到的那样,你不能同时做到这两点。

按编号排序:

SELECT Title, Singer, Album
  FROM dbo.Songs
  ORDER BY Singer, Album, 
    CONVERT(INT, SUBSTRING(Title, 1, CHARINDEX('.', Title)));

按字母顺序对标题进行排序:

SELECT Title, Singer, Album
  FROM dbo.Songs
  ORDER BY Singer, Album, 
    SUBSTRING(Title, CHARINDEX('.', Title) + 1, 255); 
    -- 255 or whatever the column is defined as

很多人会建议LEN(Title),但对我而言,这是一项不必要的计算。恕我直言的唯一理由是,模式正在快速发展,并且该列的最大长度不能被认为是“稳定的”。在这些情况下,我可能仍然建议使用更高的数字,这可能适应该列的任何未来大小增加,例如4000

如@ a1ex07暗示,您应该考虑分别存储号码和标题。您可以按如下方式执行此操作:

ALTER TABLE dbo.Songs ADD SongNumber TINYINT;
ALTER TABLE dbo.Songs ADD SongTitle VARCHAR(255);

UPDATE dbo.Songs SET 
  SongNumber = CONVERT(TINYINT, SUBSTRING(Title, 1, CHARINDEX('.', Title))),
  SongTitle  = SUBSTRING(Title, CHARINDEX('.', Title) + 1, 255);

-- once you've verified:    
ALTER TABLE dbo.Songs DROP COLUMN Title;

您还必须更新访问此表的任何进程(或创建视图并将其指向视图)。现在,如果您想按SongNumberSongTitle排序,则ORDER BY子句要简单得多。 (但是你仍然无法按两者进行排序,如果你考虑它就会很有意义。)

答案 2 :(得分:0)

看起来Singer, Album,Title排序的唯一问题是标题包含数字和字符串(因为它打破1NF所以不好)。如果您完全确定title格式,则可以执行

ORDER BY Singer, Album,
cast(substring(Title,0,CHARINDEX( '.',Title)) as int),
substring(Title,CHARINDEX( '.',Title)+1,LEN(Title))
-- LEN(Title) should work, even though it would be more correct to put the right number of
-- characters (from position of '.' to the end)
相关问题