Sql Postgres-如果不存在具有提供的用户id的行,则选择用户id为NULL的项

Sql Postgres-如果不存在具有提供的用户id的行,则选择用户id为NULL的项,sql,postgresql,Sql,Postgresql,我有一个表item\u元数据(item\u id、item\u name、user\u id) 我正在使用自定义名称存储相同的项目id,具体取决于用户id,如果没有可用的自定义名称,我希望使用“默认”名称 item_id | item_name | user_id 001 | 'Default Name' | NULL 001 | 'Custom Name' | 100 鉴于上述情况,如果我将100作为user\u id参数传入,我希望我的查询返回'Custo

我有一个表
item\u元数据(item\u id、item\u name、user\u id)


我正在使用自定义名称存储相同的
项目id
,具体取决于
用户id
,如果没有可用的自定义名称,我希望使用“默认”名称

item_id | item_name       | user_id
001     | 'Default Name'  | NULL
001     | 'Custom Name'   | 100
鉴于上述情况,如果我将
100
作为
user\u id
参数传入,我希望我的查询返回
'Custom Name'
,但如果我将
101
作为
user\u id
参数传入,则返回
'Default Name'


我尝试过使用
COALESCE
UNION
/
INTERSECT
/
,除了
,但我似乎没有得到我想要的结果。

你可以使用
COALESCE()
这样做:

select coalesce(
  (select item_name from item_metadata where user_id = ?),
  (select item_name from item_metadata where user_id is null)
  ) item_name;
替换为您搜索的
用户id


请参阅。

我知道这会让你的问题变得复杂,因此如果它不适合你的情况,请在评论中这样说,我将删除它

我遇到过这样的情况:一个项目有一个默认名称,但我们希望为特定用户显示一个自定义名称

因此:

模式(PostgreSQL v11)


提取所有用户/项目对

select u.user_name, i.id as item_id, 
       coalesce(no.custom_name, i.default_name) as item_name
  from user_tab u
 cross join item i
  left join item_user_name_override no 
   on no.item_id = i.id and no.user_id = u.id
 order by i.id, u.id 
;

如果您想将此用于一个项目:

select t.*
from t
where item_id = '001'  and
      (user_id = 100 or user_id is null)
order by (user_id is not null)::int desc;
如果要对所有项目使用此选项,请在上使用

select distinct on (item_id) t.*
from t
where user_id = 100 or user_id is null
order by item_id, (user_id is not null)::int desc;

您可以发布您尝试过的查询吗?我试图在一个表中完成这一切,但此解决方案非常有效,谢谢!
select t.*
from t
where item_id = '001'  and
      (user_id = 100 or user_id is null)
order by (user_id is not null)::int desc;
select distinct on (item_id) t.*
from t
where user_id = 100 or user_id is null
order by item_id, (user_id is not null)::int desc;