【问题标题】:Database Wide Constant数据库范围常量
【发布时间】:2016-10-31 18:09:17
【问题描述】:

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

例如,有一个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 能做到这一点还是有解决办法?

【问题讨论】:

标签: postgresql


【解决方案1】:

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

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;

自定义参数名称中的点为必填项。

【讨论】:

    【解决方案2】:

    创建一个表。

    例如:

    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。这完全取决于您喜欢的语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 2022-07-26
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      相关资源
      最近更新 更多