2016-08-22 5 views
1

通知設定を格納するテーブルを作成しようとしています。この表では、通知設定はtype,user_idおよびoptionsの列を持ちます。 NULL user_id FKの行は、デフォルトの設定値を表し、ユーザーが設定に行った変更は、user_idを使用してテーブルに反映されます。(列=?または列がヌルです)を照会するときにヌル列が最初に返されます

User#fetchSettings機能は、フェッチするための型の配列を受け取り、あるいは全く種類が提供されていない場合は、それらのすべてを取得します。この関数は、要求された各タイプの設定を返す必要があります。user_idがNULLのローに対して、user_idのローを返します。しかし、私はuser_idで行をNULLで行より優先させる方法を見つけることができません。次のように

私のクエリは次のとおりです。

select distinct ON (type) 
    "type", 
    "options", 
    "user_id" 
from "user_settings" 
where 
    (
     "user_settings"."user_id" = '1' 
     or "user_id" is null 
    ) 
and "type" in ('type1', 'type2', 'type3'); 

答えて

2

DISTINCT ON ("type")で行を選択します。これは、同じタイプの複数の行がある場合にセットの最初の行を選択します。あなたは適切に行を注文してnull値を持つ行を超える特定user_idを持つ行を好むことができます。

select distinct ON (type) 
    "type", 
    "options", 
    "user_id" 
from "user_settings" 
where 
    (
     "user_settings"."user_id" = '1' 
     or "user_id" is null 
    ) 
and "type" in ('type1', 'type2', 'type3') 
order by 1, 2, 3 nulls last; 
0

はすぐに質問を投稿した後、それを考え出しました。 order by節を追加することで、user_idsが設定された行の後にnullを配置することができました。新しいクエリ:

select distinct ON (type) 
    "type", 
    "description", 
    "options", 
    "user_id" 
from "user_settings" 
where 
    (
     "user_settings"."user_id" = '385' 
     or "user_id" is null 
    ) 
    and "type" in (...) 
order by "type" asc, "user_id" asc; 
+1

ハ!ちょうど私があなたのために書いているもの。安全な側には 'nulls last'を使用してください。 – Patrick

+0

ありがとうございます!申し訳ありませんが、私はそれが何であるかを認識したときに、誰も反応していないことを望んでいました!ここで最後にnullsについて知りませんでしたので、もう一度ありがとう! – terpak

+0

問題はありませんが、回答が同時に作成されることが頻繁に発生します。 – Patrick

関連する問題