sql - 为整个数据库创建常量字符串

标签 sql postgresql constants

我对 SQL 还是个新手,所以我有一些小问题需要解决。 我在 Acqua Data Studio 中运行一个 Postgres 数据库,一些查询遵循相同的模型。
这些查询中的一些变量是相同的,但将来可能会发生变化...

考虑到优化的数据库,更改常量的值比输入 20 多个查询并更改所有查询的相同方面要快。

例子:

SELECT *
FROM Table AS Default_Configs      
    LEFT JOIN Table AS Test_Configs
        ON Default_Configs.Column1 = 'BLABLABLA'

假设“BLABLABLA”可以是“XXX”,我如何才能使“BLABLABLA”成为按照此模式创建的每个 View 的常量?

最佳答案

创建一个用作“全局常量”的小函数:

CREATE OR REPLACE FUNCTION f_my_constant()
  RETURNS text AS
$$SELECT text 'XXX'$$ LANGUAGE sql IMMUTABLE PARALLEL SAFE; -- see below

并在您的查询中使用该函数代替 'BLABLABLA'

一定要正确声明数据类型并使function IMMUTABLE (因为它是)在大型查询中获得更好的性能。

在 Postgres 9.6 或更高版本中添加 PARALLEL SAFE,因此它不会阻止并行查询计划。该设置在旧版本中无效。

要更改常量,请通过运行更新的 CREATE OR REPLACE FUNCTION 语句来替换函数。自动使用它使查询计划无效,因此重新计划查询。同时使用应该是安全的。更改后开始的交易使用新功能。但是涉及该函数的索引必须手动重建。


或者(特别是在 pg 9.2 或更高版本中),您可以设置 Customized Option作为整个集群、给定数据库、给定角色等的“全局常量”,并通过以下方式检索值:

current_setting('constant.blabla')

一个限制:该值始终是 text 并且可能必须转换为目标类型。

相关:

多种设置方式:

关于sql - 为整个数据库创建常量字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22663599/

相关文章:

sql - 选择 id_field WHERE max(date_field) < 'some date'

database - 使用 Elixir 选择 Postgres ltree 的直接 child

php - 组合多个不同的值

database - 为什么 PostgreSQL 重新分配角色命令,更改模板数据库的所有者

mysql - 从一个表中选择所有记录并从另一个表中选择匹配记录

c++ - 使用 const_cast 创建方法的非常量变体

c++ - 为什么我不能 move map 的元素?

c++ - 对于 const 的引用,std::is_const 的等价物是什么?

sql - postgresql - 按值范围获取计数

php - 我无法使用我的密码和电子邮件访问我的管理面板。这是 PHP 和 SQL 相关的