2016-05-03 10 views
-3

データタイプがnvarcharの列で注文しようとしています。私の列のデータは以下のようになります。次の方法でSQL Serverの列を並べ替えるにはどうすればよいですか?

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 

+0

番号をソートして、新しい列を追加し、それによってソート –

+0

これまでに試したことを投稿してください。 –

+0

なぜ世界で同じ値を何度も何度も保管していますか?あなたは必然的に正規化について読む必要があります。これは、それらの値を保持するテーブル内の外部キーでなければなりません。次に、参照テーブルにSortOrder列を簡単に追加することができ、問題は簡単に処理できます。 –

答えて

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 
+0

回答ありがとうございます – Ahmed

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) 

このシナリオでは、ティルダセパレータを使用しないでください。しかし、私は可読性を向上させるためにそこに好きです。

0

これは効率的ではなく、非常にエラーが発生する可能性が高いことに注意してください。これらの値を実際の時刻として保存することを真剣に考慮する必要があります。 私はあなたの値を格納するために[timen]と呼ばれる1つの列でテーブル変数を使用しています。 最後の文字に2番目の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)); 
関連する問題