gpt4 book ai didi

PostgreSQL 不可变函数使用

转载 作者:行者123 更新时间:2023-11-29 12:22:19 25 4
gpt4 key购买 nike

我试图通过说它是不可变或稳定的函数来加强 posgresql 选择,所以我有一个函数

CREATE OR REPLACE FUNCTION get_data(uid uuid)
RETURNS integer AS $$
BEGIN
RAISE NOTICE 'UUID %', $1;
-- DO SOME STUFF
RETURN 0;

END;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;

当我这样调用它时:

SELECT get_data('3642e529-b098-4db4-b7e7-6bb62f8dcbba'::uuid)
FROM table
WHERE true LIMIT 100;

我有 100 个结果,只发出了一个通知

当我这样调用它时:

SELECT get_data(table.hash)
FROM table
WHERE 1 = 1 AND table.hash = '3642e529-b098-4db4-b7e7-6bb62f8dcbba' LIMIT 100;

我有 100 个结果和 100 个通知

添加条件 (table.hash = '3642e529-b098-4db4-b7e7-6bb62f8dcbba') 以确保输入参数相同

table.hash是uuid类型

问题是:那么如何强制 PG 缓存函数的结果呢?(如果可能的话)我只想在第二种情况下提出一个通知(函数调用)...

最佳答案

在您的第一个示例中,get_data('3642e529-b098-4db4-b7e7-6bb62f8dcbba'::uuid) 是一个常量,独立于表行,因此它被评估一次.

在第二个示例中,get_data(table.hash) 在功能上取决于列值,因此它被计算每行一次

如果您想对函数求值一次,它不能依赖于列中的值(当处理多行时)。


经过评论中的讨论,这里有一个如何对每个哈希只调用一次函数的例子:

SELECT *, get_data(x.hash) AS some_data_once_per_hash
FROM (
SELECT hash, count(*) AS ct
FROM table
WHERE table.hash = '3642e529-b098-4db4-b7e7-6bb62f8dcbba'
GROUP BY 1
) x

关于PostgreSQL 不可变函数使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14041948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com