2009-06-03 15 views
3

現在、私たちはCMSを書き直しており、クライアントは「位置」フィールドを使ってテーブル内のアイテムを並べ替えることができます。したがって、アイテムが位置1としてマークされている場合は、上部に表示され、次に位置2が表示されます。整数の順に空白のフィールドが下に表示されます

問題は、毎回位置を記入する必要がないことです。彼らは何かを再注文して、位置フィールドがしばしば空白になるようにしたい。だから...

を次のように持っているかもしれないカー - 1

バイク - 2

ハウス

コンピュータ

あなたが使用している場合ので、これが問題になります次のSQL ...

SELECT ProductName FROM Products ORDER BY Position DESC; 

空白のものはすべて下にはなく上に移動します。

SQL文を使用して正しい順序に入れられますか?

+0

David Bは2つの式で正解を返します。最初の表現にはいくつかの選択肢があります。「トリック」は、すべての非NULL値をグループ化しています。 'Position'が数値の場合は、NULL以外のすべての値を0として簡単にグループ化することができます。ORDER BY位置 - 位置DESC、位置DESC – spencer7593

答えて

15
SELECT ProductName 
FROM Products 
ORDER BY 
    CASE WHEN Position is null THEN 1 ELSE 0 END, 
    Position 

あなたが一番下にヌルを維持しながら、位置降順で注文したい場合は、これはそれを行います。

ORDER BY 
    CASE WHEN Position is null THEN 1 ELSE 0 END, 
    Position desc 

あなたは(あなたがページングかもしれません)、一貫したソートをしたい場合は、[商品を追加したり、製品IDを最後に使用して、未配置の製品間のすべての関係を解除します。

ORDER BY 
    CASE WHEN Position is null THEN 1 ELSE 0 END, 
    Position, 
    ProductID 
+0

+1 @David:これは正しい答えだと思います(1ではなく2つの式でソートします)。私が見る唯一のことは、(OPの質問から)DESCキーワードを見逃したことです。 – spencer7593

+0

@David:あなたはDESCキーワードを見逃しませんでした。間違っていました。 (私は以前のコメントを編集することはできません)(D'Oh!)私は、OP質問のサンプルSQLをDESCキーワードにしましたが、OPが望むものではありません。 ORDER BY位置 - 位置DESC、-1 *位置DESC – spencer7593

+0

xを丸めて赤いボタンを少し丸くして、削除できるようにする必要があります –

2
SELECT ProductName 
FROM Products 
ORDER BY 
     COALESCE(position, (SELECT MAX(position) + 1 FROM Products)) 

また、あなたが使用することができます。

SELECT * 
FROM (
     SELECT ProductName 
     FROM Products 
     WHERE position IS NOT NULL 
     ORDER BY 
       position 
     ) q 
UNION ALL 
SELECT ProductName 
FROM Products 
WHERE position IS NULL 

これをより効率的になり、最初のサブクエリは、発注用positionにインデックスを使用しますので、1があります。

+0

descではなく、ascで並べ替える必要があります。 -1の代わりに、(商品からmax(position)+1を選択する)、ProductNameは基準で2番目の注文でなければなりません。 – Eric

0

これはあなたのために働くはずです。

CREATE TABLE [dbo].[Test](
    [Position] [int] NULL, 
    [Title] [varchar](15) NULL 
) 
GO 

INSERT INTO Test Values(1, 'P1') 
INSERT INTO Test Values(2, 'P2') 
INSERT INTO Test Values(NULL, 'P3') 
INSERT INTO Test Values(NULL, 'P4') 
INSERT INTO Test Values(NULL, 'P5') 
GO 

SELECT Title + ' - ' + CASE 
    WHEN POSITION IS NULL THEN '' 
    ELSE CAST(Position AS CHAR(3)) 
    END 
FROM Test 
ORDER BY CASE WHEN Position is null THEN 1 ELSE 0 END 
+1

サブクエリは不必要なパフォーマンスヒットのように思えます –

0

、必要なときに

あなただけが簡単に整数の最大値に「未設定」の行をデフォルトによって、ヌルの使用、および結果のソートの問題を解消することができNULLを使用します。

  • UPDATE製品SET Position = 2147483647 WHERE Position IS NULL
  • 列をNOT NULLに設定し、デフォルト値2147483647を追加します。
  • SELECT 
        ProductName 
         ,CASE 
          WHEN Position=2147483647 THEN NULL --or cast this as a varchar and use 'N/A' 
          ELSE Position 
         END 
        FROM ... 
    

    あなたが使用する必要がある場合:

  • はここ2147483647

の任意の値の表示を抑制し、あなたのアプリやロード・クエリで

  • を意図したとおりにして、ORDERを使用すると、サンプル負荷であります

    SELECT 
        ProductName 
         ,Position 
        FROM Test 
        ORDER BY COALESCE(Position,2147483647) 
    
  • +0

    hhm。NULLとISNULLをORDER BYで使用します。NULLはアルベルト値よりも良く、COALESCEはより遅い – gbn

    +0

    すべての行には値がありません。 ISNULLまたはCOALESCEを使用しなければならず、それが最も速くなります。 –

    関連する問題