web-dev-qa-db-ja.com

TSQL-ソート順を定義することは可能ですか?

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

並べ替え順序を昇順または降順ではなく、「オレンジ」、「アップル」、「イチゴ」にしてください。

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

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

28
Justin808

それは信じられないほど不格好ですが、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

そして、この新しいテーブルにテーブルを結合します。

53

CASEステートメント を使用します。

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

ELSEを使用した代替構文:

ORDER BY CASE 
           WHEN your_col = 'orange' THEN 1
           WHEN your_col = 'Apple' THEN 2
           WHEN your_col = 'strawberry' THEN 3
           ELSE 4
         END 
12
OMG Ponies

これが一時的な要件になる場合は、caseステートメントを使用します。ただし、しばらくの間存在し、常にorange/Apple/strawberryの順序になると思われる場合(またはそうでない場合でも、以下を参照)、ディスクスペースを犠牲にして速度を上げることを検討してください。

テーブルにor_ap_stという新しい列を作成し、挿入/更新トリガーを使用して、フルーツ列の値に応じて、1、2、または3の数値を入力します。次に、インデックスを付けます。

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

すると、クエリは途方もなく高速になります。

select field1, field2 from table1
order by or_ap_st;

行ごとの関数がないため、パフォーマンスが低下します。

また、他の並べ替え順序も必要な場合は、列をor_ap_stと呼びました。必要なだけ他の並べ替え列を追加できます。

7
paxdiablo

その場合に私がすることは

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

タートルピックの答えから遠くに行く

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

FRUITにさらに項目があり、THENキーワードの後に​​定義された文字で始まる場合、それらの項目はハードコードされた順序内に表示されます。たとえば、バナナはストロベリーの前に表示されます。あなたはそれを回避することができます

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

ここでは、ASCIIの値が小さい文字を使用しました。これらの値がFRUITの値の先頭に表示されないようにするためです。

1
Kuitsi

挿入の順序を維持するために、テーブルにキー(例:fruit_id int identity(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
The Danish

それほど一般的ではありませんが、単一値の演算または特定のパターンの場合、[〜#〜] 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
0
Vland