2012-04-10 9 views
2

私は非常に簡単な質問があります:どの条件が満たされたかに従って検索された行を並べ替えることは可能ですか? たとえば、私は人のテーブルを持っており、名前が "I"で始まる、または "ster"で終わる、または "lo"を含むすべての人物を検索し、 。最初に最初の条件に一致する行、次に2番目の条件に一致する行など。 (重複なし行が最初の条件を満たしている場合、それは第二の条件のために再び表示されないべきである)条件を満たしている行を並べ替えますか?

編集: Iは、ビジュアルC#で動作し、そしてIは、MS AccessでDBを管理します。

+0

標準のSQLでは不可能です。結果セットをJava、C#などに取得する場合は、プログラムで行うこともできます – ControlAltDel

+4

いいえ、標準SQLでは完全に可能です。いくつかの細部によってはちょっとしたことです。 – RBarryYoung

+0

実際の問題は、Accessがより大きなDBMS(SQL Server、Oracle、DB2など)よりも小さい標準SQLのサブセットをサポートしているため、それを実行するさまざまな方法のすべてをサポートしていない可能性があるということです。 – RBarryYoung

答えて

3

Sometこのよう興に動作するはず:Accessで

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()秒に頼らする必要がある場合があります

ORDER BY 
    IIF(name LIKE "I%",  0, 
    IIF(name LIKE "%ster%", 1, 
    IIF(name LIKE "%lo%", 2, 
    3 
))) ASC 
+0

+1 ...アクセス –

+0

の作品の正しい順序は、ありがとう:) –

6

は、一般的に言えば)=ありがとう

を(それが重要な場合は、ファイル形式は、.MDBであること)、あなたはあなたのorder byにcase文を置くことができます。

これは、例えば、SQL Serverで動作します:あなたが使用しているDBMS

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

?この回答に示すよう

UPDATE

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))); 
+0

誰もが見ることができるように元の投稿を編集しました。 –

+0

@Itamar Marom、これが機能しているかどうか教えてください。構文がわずかにオフの場合は、ここで最終的なアクセスクエリを編集してください(残念ながら、今すぐ確認できません)。 –

+0

実行しようとすると、 'sortCol'がパラメータのように要求されます... –

1

私はこれにPostgresのショットを与えたが、私はあなたが使用できると仮定します他のDBと同様の技術。条件が満たされているかどうかのブール式を返す各条件用の列を作成します。すると、その列で注文:

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

UPDATE:

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

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条件の引数のペアを渡すことによって使用されています。引数1が評価され、trueの場合は引数2が返されます。arg 1がfalseの場合はarg 3が評価されます。

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

コンテキストによっては、*%に変換する必要があることに注意してください。詳細については、Why does LIKE behave differently when being called from VB6 app?を参照してください。

関連する問題