我正在使用SQL Server 2014.我有以下名为DATE_PARAM
的表:
ID FROM_VALUE TO_VALUE PARAM_NAME USER_ID
------------------------------------------------------------------------
1 2016-01-01 2017-01-01 00:00:00.000 date NULL
2 2016-02-01 2017-01-01 00:00:00.000 date -1
3 2016-02-01 2018-02-01 00:00:00.000 anotherDate NULL
4 2016-04-01 2018-02-01 00:00:00.000 anotherDate 3
此表列出了所有可用参数。 PARAM_NAME
是参数的名称,每个参数都是唯一的。 USER_ID == NULL
表示这是管理员定义的属性。 USER_ID
==任何数字表示此参数属于user。
我希望以参数:userId=-1
为例实现 - 首先,我按PARAM_NAME
对这些记录进行分组。然后在第一优先级我想获得属于他的属性(USER_ID=-1
),但如果没有属于他的属性(在同一PARAM_NAME
内),我想由管理员{{{ 1}}。
预期结果:
USER_ID=null
我不确定它是否可以通过查询实现,即使是,如果它的性能也会很好。我试过做一个自我左外连接,但仍然没有预期的结果。
编辑 - 答案
ID FROM_VALUE TO_VALUE PARAM_NAME USER_ID
-----------------------------------------------------------------------
2 2016-02-01 2017-01-01 00:00:00.000 date -1
3 2016-02-01 2018-02-01 00:00:00.000 anotherDate NULL
答案 0 :(得分:1)
Select param_name from parameters
上面的语句假设您有一个参数表,它只是所有参数的列表。这将构建所有参数的列表,供您用作基础。然后我们将两次连接到此表,一次用于用户ID,一次用于空行。
...
from ( Select param_name from parameters) PARAM_LIST
left join (select * from tbl where user_Id = -1) users
on users.param_name = param_list.param_name
left join (select * from tbl where user_id is null) admin
on admin.param_name = param_list.param_name
现在,这将为每个参数以及用户值和管理员值提供一行。现在,你需要在select语句中使用isnull来找到合适的语句。
select isnull(users.from_value,admin.from_value),
isnull(users.to_value,admin.to_value),
param_list.param_name,
isnull(users.user_id,'admin')
全部放在一起
select isnull(users.from_value,admin.from_value),
isnull(users.to_value,admin.to_value),
param_list.param_name,
isnull(users.user_id,'admin')
from ( Select param_name from parameters) PARAM_LIST
left join (select * from tbl where user_Id = -1) users
on users.param_name = param_list.param_name
left join (select * from tbl where user_id is null) admin
on admin.param_name = param_list.param_name
编辑... sqlserver是isnull而不是ifnull ...我想