当查询(column = ?)OR列为空)

  • 本文关键字:OR 查询 column postgresql
  • 更新时间 :
  • 英文 :


我正在尝试创建一个表来存储通知设置。在这个表中,通知设置有一个type, user_idoptions列。任何具有NULL user_id FK的行都表示默认设置值,并且用户对其设置所做的任何更改都将与他们的user_id一起被插入到表中。

我的User#fetchSettings函数接受要获取的类型数组,如果没有提供类型,则获取所有类型。该函数应该为所请求的每种类型返回一个设置,返回user_id的行,而不是user_id为NULL的行。但是,我找不到一种方法来让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');

DISTINCT ON ("type")选择行。当有多行具有相同类型时,这将选择集合的第一行。您可以通过对行进行正确排序来偏爱具有特定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')
order by 1, 2, 3 nulls last;

在发布问题后不久就明白了。通过添加order by子句,我能够在设置了user_ids的行之后放置空。我的新查询是:

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;

最新更新