2011-01-25 7 views
19

返された結果のソート順を定義することはできますか?TSQL - ソート順を定義することは可能ですか?

私はソート順を 'orange' 'apple' 'strawberry'に昇順または降順にしたくありません。

私はORDER BYがASCまたはDESCを行うことができますが、DEFINED( 'orange'、 'apple'、 'strawberry')タイプのものがあることは知っていますか?

これは、SQL Serverで実行されます2000

答えて

44

:ELSEと

ORDER BY CASE your_col 
      WHEN 'orange' THEN 1 
      WHEN 'apple' THEN 2 
      WHEN 'strawberry' THEN 3 
     END 

代替構文を、注文のためのCASEステートメント:

SELECT * FROM Blah 
ORDER BY CASE MyColumn 
    WHEN 'orange' THEN 1 
    WHEN 'apple' THEN 2 
    WHEN 'strawberry' THEN 3 
    END 

また、ソートフィールドとソート順を含むセカンダリテーブルを作成することもできます。

TargetValue SortOrder 
orange  1 
apple  2 
strawberry 3 

テーブルをこの新しいテーブルに結合します。これは、短命の要件である場合ステートメントを使用しようとしている場合は、私はそのような場合には何

+14

ハ!私はLittleBobbyTablesと呼ばれる誰かから来るSQLを信頼するつもりです:-) – paxdiablo

+2

@pax - :-) – LittleBobbyTables

+0

+1テーブルオプションのために、常により柔軟な – RichardTheKiwi

9

CASE statement使用:それは信じられないほど不格好だが、あなたが使用することができます

ORDER BY CASE 
      WHEN your_col = 'orange' THEN 1 
      WHEN your_col = 'apple' THEN 2 
      WHEN your_col = 'strawberry' THEN 3 
      ELSE 4 
     END 
+0

SELECT結果の最後に特定の項目を表示したい場合はどうすればよいですか? – user1451111

2

ORDER BY 
    CASE WHEN FRUIT = 'Orange' THEN 'A' 
     WHEN FRUIT = 'Apple' THEN 'B' 
     WHEN FRUIT = 'Strawberry' THEN 'C' 
     ELSE FRUIT 
END 
+0

SELECT結果の最後に特定の項目を表示したいのですが? – user1451111

5

です。しかし、しばらくそれが周りにあるかもしれないと思うなら、それはいつもorange/apple/strawberryオーダーになるでしょう(あるいは、そうでなくても - 下記を参照)。何らかのスピードを得るためにディスクスペースを犠牲にすることを考えるかもしれません。

テーブルにor_ap_stという名前の新しい列を作成し、挿入/更新トリガーを使用してフルーツ列の値に応じて番号1,2または3を設定します。それからインデックスを作成します。

その列のデータが変更されるのは行が変更されたときだけなので、これが最適な時期です。コストは、多数の読み取りではなく少数の書き込みで発生するため、selectステートメントで償却されます。

あなたのクエリは、疑いの余地なく、高速になります。パフォーマンスを殺していない行単位の機能を備えた

select field1, field2 from table1 
order by or_ap_st; 

また、他の並べ替え順も同様にしたい場合は、それが私が列or_ap_stと呼んだ理由です。必要に応じて他のソート列を追加できます。

1

turtlepick's answerからさらに行く:

あなたがFRUITにいくつかのより多くのアイテムを持っており、彼らはTHENキーワードの後に​​定義された文字で開始するために起こる場合
ORDER BY 
    CASE WHEN FRUIT = 'Orange' THEN 'A' 
     WHEN FRUIT = 'Apple' THEN 'B' 
     WHEN FRUIT = 'Strawberry' THEN 'C' 
     ELSE FRUIT 
    END 

、これらのアイテムは、ハードコード順内に表示されます。例えば、バナナはストロベリーの前に現れます。あなたは、彼らがFRUIT内の値の先頭に表示されないという希望が低いASCII値を持つ

ORDER BY 
    CASE 
    WHEN FRUIT = 'Orange' THEN '.1' 
    WHEN FRUIT = 'Apple' THEN '.2' 
    WHEN FRUIT = 'Strawberry' THEN '.3' 
    ELSE FRUIT 
    END 

ここで私が使用している文字で、それを回避することができます。

0

テーブルにキーを追加します(例えばfruit_idのint型のアイデンティティ(1,1)主キー)

create table fruit(fruit_id int identity(1,1) primary key, name varchar(50)) 
go 

insert into fruit(name) values ('orange') 
insert into fruit(name) values ('apple') 
insert into fruit(name) values ('strawberry') 

select name from fruit 

結果、インサートの順序維持する:

orange 
apple 
strawberry 
0

として一般的ではないが、しかし、単一値演算または特定のパターンの場合、REPLACEも同様です

たとえば、

DECLARE @Fruit TABLE (Fruit_Id INT IDENTITY(1, 1) PRIMARY KEY ,Name VARCHAR(50)); 

INSERT INTO @Fruit (Name) VALUES ('Orange'); 
INSERT INTO @Fruit (Name) VALUES ('Apple'); 
INSERT INTO @Fruit (Name) VALUES ('Strawberry'); 
INSERT INTO @Fruit (Name) VALUES ('__Pear'); 


SELECT * FROM @Fruit AS f 
ORDER BY REPLACE(f.Name,'__','') 



Fruit_Id Name 
----------- -------------------------------------------------- 
2   Apple 
1   Orange 
4   __Pear 
3   Strawberry