2017-04-06 5 views
2

この小さな練習では、まず "Zoetermeer"の人々を表示し、同じ名前の人を "bondsnr"で注文する必要があります。 一意の番号)、 「Zoetermeer」以外の場所の人は「bondsnr」だけでソートする必要があります。Postgresqlは特定の値を最初に表示し、異なる基準で並べ替えます。

select spelersnr, naam, plaats, bondsnr 
from spelers 
where bondsnr is not null 
order by case when plaats = 'Zoetermeer' then 1 
      else 2 end, 
      bondsnr 

これは私が今持っているものですが、正しくないため解決策が見つからないようです。 は「ズーテルメール」の最初の作品から、人々の並べ替えが、私はこれがどのようにすべきであるその数

EDIT

spelersnr naam  plaats  bondsnr  
    27  Cools  Zoetermeer 2513 
    104 Moerman  Zoetermeer 7060 
    44 Bakker, de  Rijswijk 1124 
    112 Baalen, van Rotterdam 1319 
    83 Hofland   Den Haag 1608 
    2 Elfring   Den Haag 2411 
    8 Niewenburg  Rijswijk 2983 
    57 Bohemen, van Den Haag 6409 
    100 Permentier  Den Haag 6524 
    6 Permentier  Den Haag 8467 

で同じ名前を持つ人々を並べ替えることができますかわかりません。 私の答えは同じ結果を示していますが、正しくありません。 同じ場所に住んでいても名前で注文しないと思います。

+0

になり、私たちにいくつかのサンプルの結果を表示し、あなたがそれを望むように命じました。 (フォーマットされたテキストとしても) – jarlh

答えて

1

個々の列だけでなく、recordsでも並べ替えができます。私が正しくあなたの条件を理解していれば
だから:

select spelersnr, naam, plaats, bondsnr 
from spelers 
where bondsnr is not null 
order by 
    case 
    when plaats = 'Zoetermeer' then 
     (1,naam,bondsnr) 
    else 
     (2,null::text,bondsnr) 
    end; 
+0

ありがとう、私はそれを知らなかった! – DreamsInHD

1

あなたはintにブール値をキャストして、お好みの基準でオーダーすることができます。

例:ブールのため

with a (a, b, c) as (values (1, 2, 3), (2, 1, 3), (1, 3, 2), (2, 3, 2)) 
select * from a order by (a.a = 2)::int desc, b desc; 
a | b | c 
---+---+--- 
2 | 3 | 2 
2 | 1 | 3 
1 | 3 | 2 
1 | 2 | 3 
(4 rows) 

db_example=# with a (a, b, c) as (values (1, 2, 3), (2, 1, 3), (1, 3, 2), (2, 3, 2)) 
db_example-# select * from a order by (a.a = 2)::int desc, b asc;             
    a | b | c                            
---+---+---                            
    2 | 1 | 3                            
    2 | 3 | 2                            
    1 | 2 | 3                            
    1 | 3 | 2                            
(4 rows) 

、真は1になり、偽は0

+0

ありがとうございました! – DreamsInHD

関連する問題