首页 > 解决方案 > PostgreSQL 中的动态会话变量

问题描述

是否可以在 PostgreSQL 中使用“动态”会话变量运行查询?

我可以为变量定义一个静态值并在查询中使用它,但是如何根据对表的每条记录的迭代来设置“动态”变量?

具有定义变量的静态版本:

SET SESSION my.vars.ref = 'My value';
SELECT *
FROM sourceTable
WHERE myField LIKE current_setting('my.vars.ref')::text;

我不知道对我的 sourceTable 的每个单个值重复此操作。

我知道我可以执行一个基本的Select,但在我的真实情况下,我运行一个递归查询,它返回我聚合数据。我使用这个结果在另一个表中插入值。

编辑 - 更复杂的查询:

SET SESSION my.vars.ref = 'My value';
SELECT CONCAT('Value: ', current_setting('my.vars.ref')::text)
FROM sourceTable
WHERE myField LIKE current_setting('my.vars.ref')::text;

标签: postgresql

解决方案


如果你想用 LIKE 比较多个值,你可以使用ANY

select *
from sourcetable
where myfield LIKE ANY (array['Value one%', 'My Value 2%', 'Three%']);

不需要循环或变量。

另一种选择是加入值列表:

select st.*, v.value
from sourcetable st
  join ( 
     values ('Value one%'), 
            ('My Value 2%'), 
            ('Three%')
  ) v(value) on st.myfield LIKE v.value;

推荐阅读