3

非常に簡単な質問があります。どの条件が満たされるかに従って、取得された行を並べ替えることは可能ですか?たとえば、人のテーブルがあり、名前が「I」で始まる、「ster」で終わる、または「lo」を含むすべての人を、これらの条件が満たされる順に並べ替えて取得したいとします。最初に最初の条件に一致する行、次に2番目の条件に一致する行というように続きます。(重複なし:行が最初の条件を満たしている場合、2番目の条件では再び表示されないはずです)

編集: 私はVisual C#を使用しており、MSAccessを使用してDBを管理しています。(重要な場合、ファイル形式は.mdbです)

ありがとう=)

4

4 に答える 4

7

一般的に言って、あなたはあなたのにcaseステートメントを入れることができますorder by

これはSQLServerで機能します。次に例を示します。

order by (case when myCol like 'I%' then 1 when myCol like '%ster' then 2 when myCol like '%lo%' then 3 end)

どのDBMSを使用していますか?

アップデート

MS-ACCESSの場合、IIF次の回答に示すようにステートメントを使用できます。

ms-access-complicated-order-by

これに基づいて、おそらく次のようなものが必要になります。

SELECT *
FROM people
WHERE [name] Like "I*" Or [name] Like "*ster" Or [name] Like "*lo*"
ORDER BY IIf([name] Like "I*", 1, IIf([name] Like "*ster", 2, IIf([name] Like "*lo*", 3, 4)));
于 2012-04-10T17:53:49.273 に答える
5

このようなものが機能するはずです:

SELECT * FROM people
ORDER BY
  CASE WHEN name LIKE "I%" THEN 0
    WHEN name LIKE "%ster" THEN 1
    WHEN name LIKE "%lo%" THEN 2
    ELSE 3
  END ASC;

IIF()Accessでは、ネストされたsに頼らなければならない場合があります。

ORDER BY
  IIF( name LIKE "I%",     0,
  IIF( name LIKE "%ster%", 1,
  IIF( name LIKE "%lo%",   2,
    3
  ) ) ) ASC
于 2012-04-10T18:01:45.023 に答える
1

私はこれをPostgresで試してみましたが、他のDBでも同様の手法を使用できると思います。条件が満たされているかどうかのブール式を返す列を条件ごとに作成します。次に、その列で並べ替えます。

select
   substr(Name, 1, 1) = 'I' as StartsWithI,
   Name like '%ster' as EndsWithSter
from MyTable
order by StartsWithI desc, EndsWithSter desc

アップデート:

このms-access回答を投稿した後にタグが追加されましたが、誰かに役立つ場合に備えて、タグは残しておきます。

于 2012-04-10T18:03:55.727 に答える
1

この関数は、ネストされたステートメントSwitchの束よりもはるかに読みやすくなっています。IIf

SELECT * FROM [People]
WHERE [Name] Like "I*"
   OR [Name] Like "*ster"
   OR [Name] Like "*lo*"
ORDER BY Switch([Name] Like "I*", 1,
                [Name] Like "*ster", 2,
                True, 3)

Switch条件付きresultの引数ペアを渡すことによって使用されます。引数1が評価され、trueの場合、関数は引数2を返します。arg1がfalseの場合、arg3が評価されます。

Trueのように機能する最後から2番目の引数としての使用に注意してくださいCASE ELSE

コンテキストによっては、に変換する必要がある場合があることに注意して*ください%VB6アプリから呼び出されたときにLIKEの動作が異なるのはなぜですか?を参照してください。詳細については。

于 2012-04-10T18:52:51.387 に答える