Microsoft SQL Server
行の並べ替え/並べ替え
サーチ…
基本
まず、サンプルテーブルを設定しましょう。
-- Create a table as an example
CREATE TABLE SortOrder
(
ID INT IDENTITY PRIMARY KEY,
[Text] VARCHAR(256)
)
GO
-- Insert rows into the table
INSERT INTO SortOrder ([Text])
SELECT ('Lorem ipsum dolor sit amet, consectetur adipiscing elit')
UNION ALL SELECT ('Pellentesque eu dapibus libero')
UNION ALL SELECT ('Vestibulum et consequat est, ut hendrerit ligula')
UNION ALL SELECT ('Suspendisse sodales est congue lorem euismod, vel facilisis libero pulvinar')
UNION ALL SELECT ('Suspendisse lacus est, aliquam at varius a, fermentum nec mi')
UNION ALL SELECT ('Praesent tincidunt tortor est, nec consequat dolor malesuada quis')
UNION ALL SELECT ('Quisque at tempus arcu')
GO
データを取得するときに、行順序句(ORDER BY)を指定しないと、SQL Serverはいつでも並べ替え(列の順序) を保証しないことに注意してください。本当に、いつでも。そしてそれについて論じる要点はなく、それは何千もの文字通り、そしてインターネット上で見られている。
ORDER BY ==ソートなし。物語の終わり。
-- It may seem the rows are sorted by identifiers,
-- but there is really no way of knowing if it will always work.
-- And if you leave it like this in production, Murphy gives you a 100% that it wont.
SELECT * FROM SortOrder
GO
データの順序は2通りあります。
- 昇順(上向き)、ASCを使用
- 降順(下に移動)、DESCを使用
-- Ascending - upwards
SELECT * FROM SortOrder ORDER BY ID ASC
GO
-- Ascending is default
SELECT * FROM SortOrder ORDER BY ID
GO
-- Descending - downwards
SELECT * FROM SortOrder ORDER BY ID DESC
GO
テキスト列((n)charまたは(n)varchar)で並べ替える場合は、順序が照合を尊重するように注意してください。照合の詳細については、トピックのルックアップを参照してください。
データの順序付けと並べ替えは、リソースを消費する可能性があります。これは、適切に作成されたインデックスが便利な場所です。索引の詳細については、トピックを参照してください。
結果セットの行の順序を疑似ランダム化する可能性があります。順序を強制的に非決定的に見せてください。
SELECT * FROM SortOrder ORDER BY CHECKSUM(NEWID())
GO
順序付けはストアドプロシージャーで記憶できます。これは、行セットをエンドユーザーに表示する前に操作する最後のステップであれば、実行する必要があります。
CREATE PROCEDURE GetSortOrder
AS
SELECT *
FROM SortOrder
ORDER BY ID DESC
GO
EXEC GetSortOrder
GO
SQL Serverのビューでは、注文のための限られた(そしてハッキーな)サポートがありますが、使用しないことをお勧めします。
/* This may or may not work, and it depends on the way
your SQL Server and updates are installed */
CREATE VIEW VwSortOrder1
AS
SELECT TOP 100 PERCENT *
FROM SortOrder
ORDER BY ID DESC
GO
SELECT * FROM VwSortOrder1
GO
-- This will work, but hey... should you really use it?
CREATE VIEW VwSortOrder2
AS
SELECT TOP 99999999 *
FROM SortOrder
ORDER BY ID DESC
GO
SELECT * FROM VwSortOrder2
GO
順序付けのために、ORDER BYに列名、エイリアスまたは列番号を使用できます。
SELECT *
FROM SortOrder
ORDER BY [Text]
-- New resultset column aliased as 'Msg', feel free to use it for ordering
SELECT ID, [Text] + ' (' + CAST(ID AS nvarchar(10)) + ')' AS Msg
FROM SortOrder
ORDER BY Msg
-- Can be handy if you know your tables, but really NOT GOOD for production
SELECT *
FROM SortOrder
ORDER BY 2
コードを実行した後、そのコードを忘れてしまった場合を除いて、コード内の数字を使用しないことをお勧めします。
ケースによる注文
データを数値またはアルファベット順にソートする場合は、単にorder by [column]
使用できます。カスタム階層を使用してソートする場合は、caseステートメントを使用します。
Group
-----
Total
Young
MiddleAge
Old
Male
Female
基本的なorder by
を使用する:
Select * from MyTable
Order by Group
アルファベット順のソートを返します。これは常に望ましいとは限りません。
Group
-----
Female
Male
MiddleAge
Old
Total
Young
'case'文を追加し、データをソートする順序で昇順の数値を割り当てる:
Select * from MyTable
Order by case Group
when 'Total' then 10
when 'Male' then 20
when 'Female' then 30
when 'Young' then 40
when 'MiddleAge' then 50
when 'Old' then 60
end
指定された順序でデータを返します。
Group
-----
Total
Male
Female
Young
MiddleAge
Old