sql - Return rows with userId null or without based on group by -


i using sql server 2014. have following table named: 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 

this table list available parameters. param_name name of parameter , unique per parameter. user_id == null means attribute defined administrator. user_id == number means parameter belongs user.

what achieve example parameter: userid=-1 - first group records param_name. in first priority attribute belongs him (user_id=-1) if there no attribute belong him (within same param_name) provided administrator user_id=null.

expected result:

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 

i not sure if can realized query , if yes if in performance. tried self left outer join still not have expected result.

edit - answer

select distinct     isnull(users.from_value,admin.from_value)  from_,      isnull(users.to_value,admin.to_value)  to_,     param_list.param_name  param_name,     users.user_id user_id     (select param_name date_param) param_list left join      (select * date_param user_id = -1) users on users.param_name = param_list.param_name left join      (select * date_param user_id null) admin on admin.param_name = param_list.param_name; 

select param_name parameters 

above statement assumes have parameter table list of parameter. builds list of parameters use base. going left join twice table, once user id , once null rows.

... ( select param_name parameters) param_list left join (select * tbl user_id = -1) users     on users.param_name = param_list.param_name left join (select * tbl user_id null) admin     on admin.param_name = param_list.param_name 

this give row every parameter , user value , admin value. it's matter of using isnull's in select statement find right one.

select isnull(users.from_value,admin.from_value),         isnull(users.to_value,admin.to_value),        param_list.param_name,        isnull(users.user_id,'admin') 

put together

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 param_name parameters) param_list left join (select * tbl user_id = -1) users     on users.param_name = param_list.param_name left join (select * tbl user_id null) admin     on admin.param_name = param_list.param_name 

edit... sqlserver isnull not ifnull...i think


Comments