现在,我真的不知道如何解决这个问题。
我有能够处理不同类型任务的用户。
这些任务有很多属性。我为简单选择仅4 属性。
如果我将任务分配给用户,我必须为此分配提供费率。这个比率将决定他完成任务时我需要付多少钱。
我有下表。这些ID字段是可以为空的(user_id除外),所有这些字段都是外键。
|-#-|-user_id-|-type_id-|-task_id-|-source_id-|-target_id-|--rate--|
| 1 | 12 | NULL | 1 | 1 | 2 | 0.0022 |
| 2 | 12 | NULL | 2 | 1 | 2 | 0.0101 |
| 3 | 12 | NULL | 1 | 2 | 1 | 0.0200 |
| 4 | 12 | NULL | 2 | 2 | 1 | 0.1011 |
| 5 | 12 | 1 | NULL | NULL | NULL | 0.0750 |
| 6 | 12 | 2 | 1 | NULL | NULL | 0.0520 |
| 7 | 12 | NULL | 1 | NULL | NULL | 0.9100 |
当然其他用户也有费率。
现在有权重,只是从左到右的顺序(来自列type_id )。
但是:重要的是:从第一列匹配到左侧,必须全部等于分配的任务值或NULL 价值观。 在右侧必须等于分配的任务值或NULL
user_id: 12
type_id: 3
task_id: 2
source_id: 1
target_id: 2
应选择#2 - 0.0101 费率。
user_id: 12
type_id: 1
task_id: 2
source_id: 3
target_id: 4
应选择#5 - 0.0750 费率。
user_id: 12
type_id: 2
task_id: 1
source_id: 2
target_id: 3
应选择#6 - 0.0520 率。
到目前为止,我对此感到满意。但我无法解决以下问题:
user_id: 12
type_id: 2
task_id: 2
source_id: 2
target_id: 3
NONE 应该被选中。
user_id: 12
type_id: 3
task_id: 1
source_id: 2
target_id: 3
NONE 应该被选中。
答案 0 :(得分:1)
我认为您需要order by
和fetch first row
:
select t.*
from t
where user_id = 12 and
(type_id = 3 or type_id is null) and
(task_id = 2 or task_id is null) and
(source_id = 1 or source_id is null) and
(target_id = 2 or target_id is null)
order by ( (type_id is not null)::int +
(task_id is not null)::int +
(source_id is not null)::int +
(target_id is not null)::int
) desc
fetch first 1 row only;
这会返回符合条件的行,但会返回最少NULL
个值(即最具体的行)。
编辑:
如果您需要按顺序匹配它们,那么where
子句如下所示:
order by (type_id is not null)::int desc,
(task_id is not null)::int desc,
(source_id is not null)::int desc,
(target_id is not null)::int desc