【发布时间】:2020-05-28 09:50:41
【问题描述】:
我已经找到了我要在 Oracle 和 SQL Server 上提出的问题的解决方案(我认为),但似乎无法将其转化为 Postgres 解决方案。我正在使用 Postgres 9.3.6。
我们的想法是能够生成关于表格内容的“元数据”以用于分析目的。这只能通过对每一列运行查询来完成(AFAIK),以便找出,比如说......最小/最大/计数值等。为了使过程自动化,最好让数据库生成查询,然后执行。
以salesdata 表为例,我可以为每一列生成一个选择查询,返回 min() 值,使用以下 sn-p:
SELECT 'SELECT min('||column_name||') as minval_'||column_name||' from salesdata '
FROM information_schema.columns
WHERE table_name = 'salesdata'
优点是无论列数如何,数据库都会生成代码。
现在我想到了无数个地方来存储这些查询,或者是某种变量,或者是一个表列,然后让这些查询执行。
我想将生成的查询存储在一个变量中,然后使用EXECUTE(或EXECUTE IMMEDIATE)语句执行它们,这是采用here(见右窗格)的方法,但Postgres不会让我在外面声明一个变量一个函数,我一直在摸索它如何组合在一起,这是否是要遵循的方向,也许还有更简单的东西。
您有什么建议吗,我目前正在尝试类似的东西,受到other question 的启发,但不知道我是否朝着正确的方向前进:
CREATE OR REPLACE FUNCTION foo()
RETURNS void AS
$$
DECLARE
dyn_sql text;
BEGIN
dyn_sql := SELECT 'SELECT min('||column_name||') from salesdata'
FROM information_schema.columns
WHERE table_name = 'salesdata';
execute dyn_sql
END
$$ LANGUAGE PLPGSQL;
【问题讨论】:
-
真的不清楚你想做什么。生成查询字符串以保存它们?执行查询并保存结果?请澄清任务。并且,一如既往,请提供您的 Postgres 版本。
-
“用于分析目的” --- 这到底是什么意思?
-
你希望你的函数返回什么?每列的最小值?
-
plpgsql中没有
EXECUTE IMMEDIATE,只有EXECUTE。 -
@zerkms:数据分析是一种很好地了解表中的内容、最小/最大值/平均值、值频率、值分布、空值计数等的方法......这个是数据质量评估的起点。
标签: postgresql aggregate-functions plpgsql dynamic-sql dynamic-queries