アルバムの曲をアルファベット順に並べる(IMHOではない可能性が高い)か、番号で並べ替える(おそらく、狂気を本来の意図以外の順序で聴きたくないので、はるかに多い)かを選択する必要があります。 )。上記のコメントでほのめかしたように、両方を行うことはできません。
番号で並べ替えるには:
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)
が、私にはそれは不要な計算です。それが正当化される唯一のケースであるIMHOは、スキーマが急速に進化していて、その列の最大長が「安定している」と見なされなかった場合です。そのような場合でも、その列の将来のサイズの増加に対応できる可能性が高い、より大きな数値を使用することをお勧めします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
句がはるかに簡単になります。(ただし、それでも両方で並べ替えることはできません。考えてみると、非常に理にかなっています。)