Один ответ:
create table charge( entity char(2) , amount int ) ;
insert into charge( entity, amount) ( 'DF', 10 ) ; -- defualt;
insert into charge( entity, amount) ( 'AK', 15 ) ; -- alaska;
insert into charge( entity, amount) ( 'HI', 15) ; -- hiwaii;
Тогда:
select coalesce( amount,( select amount from charge where entity = 'DF') )
from charge where entity = 'DC';
получите сумму по умолчанию.
попеременно:
select amount
from charge
where entity
= ( select coalesce( entity, 'DF') from charge where entity = 'DC');
Другими словами, используйте нулевой результат и объедините, чтобы либо заменить несуществующие результаты результатом по умолчанию, либо заменить не перечисленный объект на объект по умолчанию.
Вы хотите общую технику / идиому или детальный дизайн для конкретного случая? Это общая идиома.
Если это особый случай, посмотрите на то, что сказал Роберт Харви: «Все остальные правила кажутся аддитивными». Если это так, ваш дизайн становится очень простым: таблица расходов или (лучше) таблица расходов, таблица юрисдикций и отношение «многие ко многим». Опять же, это работает только в аддитивном случае;
create table surcharges ( id int not null primary key,
description varchar(50) not null, amount int ) ;
create table jurisdiction ( id int not null primary key,
name varchar(50) not null, abbr char(5) );
create table jurisdiction_surcharge ( id int not null primary key,
jurisdiction_id int not null references jurisdiction(id),
surcharge_id int not null references surcharge(id) );
insert into charges (description, amount) values ( 'Outside Continental US', 15 );
insert into jurisdiction (name, abbr) values ( 'Mainland US', 'CONUS');
insert into jurisdiction (name, abbr) values ( 'Alaska', 'AK');
insert into jurisdiction (name, abbr) values ( 'Hawaii', 'HI');
insert into jurisdiction_surcharge
values ( jurisdiction_id, surcharge_id) values ( 2, 1 );
insert into jurisdiction_surcharge
values ( jurisdiction_id, surcharge_id) values ( 3, 1 );
Список сборов:
select a.*
from charges a
join jurisdiction_charge b on (a.id = b.surcharge_id)
join jurisdiction c on (c.id = b.jurisdiction_id)
where c.abbr='AK';
Сумма расходов:
select sum(a.amount)
from charges a
join jurisdiction_charge b on (a.id = b.surcharge_id)
join jurisdiction c on (c.id = b.jurisdiction_id)
where c.abbr='AK';