web-dev-qa-db-ja.com

データベースがNULLS LASTでサポートしていない場合、どうすれば注文できますか?

Select      FullName, Login 
FROM        [User]
ORDER BY    FullName desc, login asc

結果

FullName                      Login
----------------------------- ------------------------------
M...... H.........            [email protected]
A.... H.....                  [email protected]
NULL                          [email protected]
NULL                          [email protected]
NULL                          [email protected]

私が欲しいもの

FullName                      Login
----------------------------- ------------------------------
A.... H.....                  [email protected]
M...... H.........            [email protected]
NULL                          [email protected]
NULL                          [email protected]
NULL                          [email protected]

フルネームをabcオーダーdescにして、ログインと同じにしたいのですが、すべてのヌルを一番下に移動させたいです。

7
lizzy81
 Select      FullName, Login 
 FROM        [User]
 ORDER BY    CASE WHEN FullName IS NULL THEN 'ZZZZZZZ' ELSE FullName END, login asc
7
Kenneth Fisher

SQL Serverで NULLS LAST のサポートを要求する(閉じた)接続項目があります。

他のいくつかの方法があります

ORDER BY 
        CASE WHEN FullName IS NULL THEN 1 ELSE 0 END, 
        FullName,
        Login

これは、正当なデータが後からソートされることはないと想定されている文字列のハードコーディングに依存しないため、これを好みます。一部の大文字と小文字を区別する照合ではZの前にZでソートし、他の場合はその逆が適用されることを考慮する必要はありませんが、それは問題でしょうか?同様に、 " ŽeljkoIvanek "は、すべての照合で確実に "ZZZZZZZ"の前にソートされますか?名前に存在し、「Z」の後にソートされる他の言語の他の文字はありますか?

FullName, Loginにインデックスがある場合、より効率的なソリューションになる可能性があります(並べ替えを回避できるため)

CREATE TABLE [User]
  (
     FullName VARCHAR(100),
     Login    VARCHAR(100),
     INDEX IX (FullName,Login) /*Use separate create index if < 2014*/
  );

WITH T
     AS (SELECT 1 AS Grp,
                *
         FROM   [User]
         WHERE  FullName IS NOT NULL
         UNION ALL
         SELECT 2 AS Grp,
                *
         FROM   [User]
         WHERE  FullName IS NULL)
SELECT FullName,
       Login
FROM   T
ORDER  BY Grp,
          FullName,
          Login 

enter image description here

28
Martin Smith