サーチ…


基本

まず、サンプルテーブルを設定しましょう。

-- 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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow