返された結果のソート順を定義することはできますか?TSQL - ソート順を定義することは可能ですか?
私はソート順を 'orange' 'apple' 'strawberry'に昇順または降順にしたくありません。
私はORDER BYがASCまたはDESCを行うことができますが、DEFINED( 'orange'、 'apple'、 'strawberry')タイプのものがあることは知っていますか?
これは、SQL Serverで実行されます2000
返された結果のソート順を定義することはできますか?TSQL - ソート順を定義することは可能ですか?
私はソート順を 'orange' 'apple' 'strawberry'に昇順または降順にしたくありません。
私はORDER BYがASCまたはDESCを行うことができますが、DEFINED( 'orange'、 'apple'、 'strawberry')タイプのものがあることは知っていますか?
これは、SQL Serverで実行されます2000
: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
テーブルをこの新しいテーブルに結合します。これは、短命の要件である場合ステートメントを使用しようとしている場合は、私はそのような場合には何
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
SELECT結果の最後に特定の項目を表示したい場合はどうすればよいですか? – user1451111
は
ORDER BY
CASE WHEN FRUIT = 'Orange' THEN 'A'
WHEN FRUIT = 'Apple' THEN 'B'
WHEN FRUIT = 'Strawberry' THEN 'C'
ELSE FRUIT
END
SELECT結果の最後に特定の項目を表示したいのですが? – user1451111
です。しかし、しばらくそれが周りにあるかもしれないと思うなら、それはいつもorange/apple/strawberry
オーダーになるでしょう(あるいは、そうでなくても - 下記を参照)。何らかのスピードを得るためにディスクスペースを犠牲にすることを考えるかもしれません。
テーブルにor_ap_st
という名前の新しい列を作成し、挿入/更新トリガーを使用してフルーツ列の値に応じて番号1,2または3を設定します。それからインデックスを作成します。
その列のデータが変更されるのは行が変更されたときだけなので、これが最適な時期です。コストは、多数の読み取りではなく少数の書き込みで発生するため、select
ステートメントで償却されます。
あなたのクエリは、疑いの余地なく、高速になります。パフォーマンスを殺していない行単位の機能を備えた
select field1, field2 from table1
order by or_ap_st;
。
また、他の並べ替え順も同様にしたい場合は、それが私が列or_ap_st
と呼んだ理由です。必要に応じて他のソート列を追加できます。
は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
ここで私が使用している文字で、それを回避することができます。
テーブルにキーを追加します(例えば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
として一般的ではないが、しかし、単一値演算または特定のパターンの場合、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
ハ!私はLittleBobbyTablesと呼ばれる誰かから来るSQLを信頼するつもりです:-) – paxdiablo
@pax - :-) –
LittleBobbyTables
+1テーブルオプションのために、常により柔軟な – RichardTheKiwi