数据库范围常数

时间:2016-10-31 18:09:17

标签: postgresql

我的数据库架构中有几个类型列。

例如,有一个type_id列,可以是主要,次要,工作或旧地址。

查询员工的所有旧地址将如下所示:

select a.*
from employees e
join employeeaddresses ea on ea.employee_id = e.employee_id
join addresses a on ea.adress_id = a.address_id
where ea.type_id = 4 -- old addresses

我想介绍一个内部映射到4的数据库范围常量TYPE_OLDADDRESS

所以查询看起来像这样:

select a.*
from employees e
join employeeaddresses ea on ea.employee_id = e.employee_id
join addresses a on ea.adress_id = a.address_id
where ea.type_id = TYPE_OLDADDRESS;

postgres能够做到这一点还是有解决方法?

2 个答案:

答案 0 :(得分:2)

您可以设置/创建会话/角色/数据库范围的参数,例如:

set parameter.name to value; -- for the current session only
alter role rolename set parameter.name to value; -- for the specified role, relogin required
alter database dbname set parameter.name to value; -- for the specified database, relogin required

然后使用current_setting函数获取它:

select current_setting('parameter.name');

该函数返回文本值,因此可能需要显式类型转换。

要从角色/数据库中删除参数定义,请使用reset而不是set关键字:

alter database dbname reset parameter.name;

自定义参数名称中的点是必需的。

答案 1 :(得分:1)

创建一个表格。

例如:

CREATE TABLE global_constants(
   name char(20),
   value int);

插入相应的值

insert into global_constants values('TYPE_OLDADDRESS',4);

然后你可以使用子查询:

select a.*
from employees e
join employeeaddresses ea on ea.employee_id = e.employee_id
join addresses a on ea.adress_id = a.address_id
where ea.type_id = (select value from global contantants where name = 'TYPE_OLDADDRESS');

您也可以使用UDF。这完全取决于您喜欢的语法。