返される結果のソート順を定義することは可能ですか?
並べ替え順序を昇順または降順ではなく、「オレンジ」、「アップル」、「イチゴ」にしてください。
ORDER BYでASCまたはDESCを実行できることはわかっていますが、DEFINED( 'orange'、 'Apple'、 'strawberry')タイプのものはありますか?
これはSQL Server 2000で実行されます。
それは信じられないほど不格好ですが、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
そして、この新しいテーブルにテーブルを結合します。
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
これが一時的な要件になる場合は、caseステートメントを使用します。ただし、しばらくの間存在し、常にorange/Apple/strawberry
の順序になると思われる場合(またはそうでない場合でも、以下を参照)、ディスクスペースを犠牲にして速度を上げることを検討してください。
テーブルにor_ap_st
という新しい列を作成し、挿入/更新トリガーを使用して、フルーツ列の値に応じて、1、2、または3の数値を入力します。次に、インデックスを付けます。
その列のデータが変更されるのは行が変更されるときだけなので、それが最も良いタイミングです。コストは、多数の読み取りではなく少数の書き込みで発生するため、select
ステートメントで償却されます。
すると、クエリは途方もなく高速になります。
select field1, field2 from table1
order by or_ap_st;
行ごとの関数がないため、パフォーマンスが低下します。
また、他の並べ替え順序も必要な場合は、列をor_ap_st
と呼びました。必要なだけ他の並べ替え列を追加できます。
その場合に私がすることは
ORDER BY
CASE WHEN FRUIT = 'Orange' THEN 'A'
WHEN FRUIT = 'Apple' THEN 'B'
WHEN FRUIT = 'Strawberry' THEN 'C'
ELSE FRUIT
END
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の値の先頭に表示されないようにするためです。
挿入の順序を維持するために、テーブルにキー(例: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
それほど一般的ではありませんが、単一値の演算または特定のパターンの場合、[〜#〜] 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