您需要选择是要按字母顺序(恕我直言,不太可能)还是按数字(更可能,因为我不想以任何顺序听《月亮的黑暗面》)初衷)。正如我在上面的评论中提到的那样,你不能两者都做。
按数字排序:
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;
您还必须更新访问此表的所有进程(或创建一个视图并将它们指向该视图)。现在,如果您想按SongNumber 或SongTitle 排序,您的ORDER BY 子句要简单得多。 (但您仍然无法同时对两者进行排序,如果您考虑一下,这很有意义。)