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
Post a Comment