2017-07-31 1 views
0

私はいくつかの結果(私の場合は単一の結果)を一番上に置き、残りを並べ替えるクエリを作成しようとしています。私はまだPostgreSQLのソリューションを見つけていません。PostgreSQLでORDER BYの後ろに完全一致を行う方法

私はairportsと呼ばれるテーブルがあります。要するに

id | code |  display_name   
----+------+---------------------------- 
    1 | SDF | International    
    2 | INT | International Airport  
    3 | TES | Test       
    4 | APP | Airport Place International 

、私は非同期的に呼び出されるコントローラメソッドでクエリを持っている場合のいずれかcodeまたはdisplay_nameによって空港のためのユーザーのテキストを検索します。しかし、codeと一致する入力をユーザーが入力すると(空港コードは一意)、その結果が最初に表示され、のintを持つすべての空港を昇順で表示します。完全一致がない場合は、昇順でソートされたワイルドカードを返します。display_nameINTで、ユーザはタイプのであれば、行(2, INT, International Airport)は、他の人が続い最初に返されるべきである:

Results: 
1. INT | International Airport 
2. APP | Airport Place International 
3. SDF | International 

ここで私はそれをいじったクエリの種類は、私のアプリケーションのコンテキスト外の意味を作るために、わずかに単純化されていますが、それにもかかわらず、同じコンセプト。

私は INTを入力すると今の結果は、私は私の ORDER BYが不正確である必要がありますが、私はそれが 任意の助けをいただければ幸い取得する:)

見えることはできません

Results: 
1. APP | Airport Place International 
2. INT | International Airport 
3. SDF | International 

を取得しています

SELECT * FROM airports 
WHERE display_name LIKE 'somesearchtext%' 
ORDER BY (CASE WHEN a.code = 'somesearchtext` THEN a.code ELSE a.display_name END) 

答えて

1

codeの完全一致を最初に戻したい場合は、これがトリックです:

SELECT a.* 
FROM airports a 
WHERE a.display_name LIKE 'somesearchtext%' 
ORDER BY (CASE WHEN a.code = 'somesearchtext' THEN 1 ELSE 2 END), 
     a.display_name 

また、としてこれを書くことができます:

ORDER BY (a.code = 'somesearchtext') DESC, a.display_name 

これは標準SQLではありませんが、それは非常に読みやすいです。

+0

注意。 "="は論理値を返し、TRUEはFALSEの後にソートするので、 "ORDER BY a.code = 'yourvalue' DESC、a.display_name" – peufeu

0

UNIONを使用して目標を達成できると思います。 最初に完全一致を取得し、その結果を残りのデータに追加します。

例えば...(あなたはこのビットで動作する必要があります)あなたはCASEを必要としない

SELECT * FROM airports 
WHERE code == 'somesearchtext' 
ORDER BY display_name 

UNION 

SELECT * FROM airports 
WHERE code != 'somesearchtext' AND display_name LIKE 'somesearchtext%' 
ORDER BY display_name 
関連する問題