返回userId为null或不基于group by的行

时间:2016-08-08 19:38:36

标签: sql sql-server

我正在使用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

1 个答案:

答案 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 ...我想