我可以在PostgreSQL中将查询分解为函数吗?



我希望将复杂的查询分解为一些可以重用的逻辑块;

有没有办法在PostgreSQL中做类似于以下内容的事情?

create or replace function isGood(myTable myschema.thetable)
returns boolean as $$
begin
return myTable.state not in ('BAD');
end;
$$ LANGUAGE plpgsql;
select * from myschema.thetable myTable where isGood(myTable) limit 1;

当然:

CREATE OR REPLACE FUNCTION isGood(my_row thetable) RETURNS boolean AS $SQL$
SELECT my_row.state not in ('BAD');
$SQL$ LANGUAGE SQL IMMUTABLE;

LANGUAGE SQL表示函数必须是有效的 SQL 查询(因此可以由查询优化器内联(,IMMUTABLE表示在给定相同输入的情况下,函数结果将始终相同(与结果也取决于给定参数之外的表内容STABLE相反,VOLATILE多次调用函数不能保证结果将保持不变,就像使用RANDOM()CURRENT_TIME()一样,这样可以进一步优化。

函数还可以返回集合:

CREATE OR REPLACE FUNCTION split_words(sentence text) RETURNS SETOF text AS $SQL$
SELECT word FROM regexp_split_to_table(sentence, 's+') as t(word)
$SQL$ LANGUAGE SQL IMMUTABLE;
SELECT split_words('Hello world!');

。甚至是虚拟表,它们的工作方式大多类似于视图,只是它们可以有参数:

CREATE OR REPLACE FUNCTION word_pairs(sentence text) RETURNS TABLE (word1 text, word2 text) AS $SQL$
SELECT word, lead(word, 1) OVER () FROM split_words(sentence) as t(word)
$SQL$ LANGUAGE SQL IMMUTABLE;
SELECT * from word_pairs('Welcome to Stack Overflow!');

根据您打算执行的操作,您可能还需要使用视图或公用表表达式。

最新更新