我希望将复杂的查询分解为一些可以重用的逻辑块;
有没有办法在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!');
根据您打算执行的操作,您可能还需要使用视图或公用表表达式。