3

http://msdn.microsoft.com/en-us/library/ms181765.aspx

上記のリンクから以下のSQLが表示されます。

SELECT BusinessEntityID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
    ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
GO

ここに私が得る1つの結果があります:

BusinessEntityID、SalariedFlag

7,1

5,1

3,1

1,1

2,0

4,0

6,0

8,0

同じ salariedFlag を持つレコードが隣り合っている理由と、なぜ salariedFlag=1 チャンクが salariedFlag=0 チャンクの上にあるのか、誰か説明できますか?

4

4 に答える 4

5

sort 句は次のものと同等です。これは、もう少し明白です。

ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID ELSE null END DESC
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID ELSE null END;

したがって、SalariedFlag = 1 または null の場合、最初の並べ替えフィールドは BusinessEntityID です。
これにより、SalariedFlag = 0 のすべての行がグループ化されます。これは、最初の並べ替えフィールドが null であるためです。
SalariedFlag = 1 の行は BusinessEntityID でソートされます。null は降順ソートで最後にソートされるように見えるため、すべての SalariedFlag != 1 が最後になります。

これが主要な並べ替えで、2 番目の並べ替えでもほぼ同じことが起こります
。SalariedFlag = 0 のすべての行が BusinessEntityID で並べ替えられます。これらの主要な並べ替えフィールドはすべて null であるため、最終的に BusinessEntityID で並べ替えられます。

また、SalariedFlag != 0 のすべての行は、null の二次順序でグループ化されます。これらの行が SalariedFlag = 1 である場合、それらはすでに主な順序で並べ替えられています。

SalariedFlag が 0 または 1 しかない場合、この並べ替えは (わずかに) 次のように簡略化できます。

ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
        , BusinessEntityID;
于 2012-05-18T00:29:57.430 に答える
2

SELECT句にCASEWHEN条件を含めることで、そのようにソートされた理由を簡単に視覚化できます。

SELECT BusinessEntityID, SalariedFlag,

CASE SalariedFlag WHEN 1 THEN BusinessEntityID END AS A,
CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END AS B

FROM Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
    ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;

出力:

BUSINESSENTITYID  SALARIEDFLAG      A                 B
7                 1                 7                 (null)
5                 1                 5                 (null)
3                 1                 3                 (null)
1                 1                 1                 (null)
2                 0                 (null)            2
4                 0                 (null)            4
6                 0                 (null)            6
8                 0                 (null)            8

SalariedFlag 0が一緒にとどまる理由は、それらがすべてnullに該当するためです(列Aを参照)。SalariedFlagに別の値(たとえば2)があり、そのクエリが機能しなくなった場合は、まったく別の問題になります。フラグは必ずしも互いに隣接しているとは限りません。

NULLで最初にソートします。DESCを指定すると、最後にソートされます。

ライブテスト:http ://www.sqlfiddle.com/#!3 / 1b849 / 13


そのクエリのCASEWHEN'STHENが整数型のBusinessEntityIDを使用していることを認識して、次のクエリを実行して同じ効果を得ることができます。また、SalariedFlagを分離子として使用するため、ORDER BYで条件を使用していないため、次のクエリの方が高速になる可能性があります。SalariedFlagを切り替えて、並べ替えることができます。

-- just to visualize things up
SELECT BusinessEntityID, SalariedFlag,

    A = BusinessEntityID * SalariedFlag,
    B = BusinessEntityID * (SalariedFlag ^ 1) 

FROM Employee
ORDER BY A DESC, B 

-- in actual you do this:

SELECT BusinessEntityID, SalariedFlag

FROM Employee
ORDER BY BusinessEntityID * SalariedFlag DESC, BusinessEntityID * (SalariedFlag ^ 1) 

このデータを考えると:

CREATE TABLE [Employee]
    ([BusinessEntityID] int, [SalariedFlag] int);

INSERT INTO [Employee]
    ([BusinessEntityID], [SalariedFlag])
VALUES
    (10, 1),
    (5, 1),
    (9, 1),
    (1, 1),
    (2, 0),
    (7, 0),
    (6, 0),
    (8, 0);

これは出力です:

BUSINESSENTITYID  SALARIEDFLAG      A                 B
10                1                 10                0
9                 1                 9                 0
5                 1                 5                 0
1                 1                 1                 0
2                 0                 0                 2
6                 0                 0                 6
7                 0                 0                 7
8                 0                 0                 8

ライブテスト:http ://www.sqlfiddle.com/#!3 / e65ac / 2

于 2012-05-18T01:26:41.677 に答える
1

BusinessEntityIDフラグが のときに最初に注文し、フラグがのときに1同点を解決します。これは、最初の式が ではない場合に評価され、 のフラグを持つすべてのレコードが のフラグを持つレコードの後に​​移動されるためです。BusinessEntityID0CASEnullSalariedFlag101

于 2012-05-18T00:29:38.220 に答える
0

選択し直す値のリストに case ステートメントを含めてみてください。並べ替えが実際に行われている値を明確にするのに役立つはずです。

于 2012-05-18T00:21:28.273 に答える