在PL/pgSQL上执行和执行有什么区别?
从手册:
有时,评估表达式或SELECT查询但丢弃结果很有用,例如在调用具有副作用但没有有用结果值的函数时.要在PL/pgSQL中执行此操作,请使用PERFORM语句.
但是,当我尝试这样的事情时:
perform 'create table foo as (select 1)';
Run Code Online (Sandbox Code Playgroud)
什么都没发生.虽然此查询应该有副作用(创建表),但结果可以被丢弃.
我想我有一件事是正确的:为了运行我可以使用的函数:
perform pg_temp.addInheritance(foo);
Run Code Online (Sandbox Code Playgroud) 我正在尝试遍历几个字段并在它们上运行一个函数:
FOR field IN ARRAY['f1','f2'] LOOP
execute pg_temp.converFieldToLower(newTableNameRaw,field)
END LOOP;
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试使用的功能:
CREATE OR REPLACE FUNCTION pg_temp.converFieldToLower(t varchar, f varchar) RETURNS void AS $$
#variable_conflict use_variable
BEGIN
EXECUTE concat_ws (' ', 'UPDATE',t,'SET',f,'= LOWER(',f,')');
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
看起来这不是声明数组的正确方法,我做错了什么?
Run Code Online (Sandbox Code Playgroud)ERROR: syntax error at or near "ARRAY" LINE 49: FOR field IN ARRAY['f1','f2'] LOOP
以下行返回错误:
self.m, self.userCodeToUserNameList, self.itemsList, self.userToKeyHash, self.fileToKeyHash = readUserFileMatrixFromFile(x,True)
Run Code Online (Sandbox Code Playgroud)
该函数实际返回6个值.但在这种情况下,最后一个是无用的(无).所以我只想存储5个.
是否可以忽略最后一个值?
我正在使用文件 ID 字段聚合一个表。每个文件都有一个与一个(他的)文件 ID 完全匹配的名称。
select file_key, min(fullfilepath)
from table
group by file_key
Run Code Online (Sandbox Code Playgroud)
因为我知道表的结构,所以我知道我需要任何完整文件路径。最小值和最大值都可以,但是需要很多时间。
我遇到了这个返回第一个值的聚合函数。不幸的是,这个函数需要很长时间,因为它会扫描整个表。例如,这非常慢:
select first(file_id) from table;
Run Code Online (Sandbox Code Playgroud)
最快的方法是什么?有或没有聚合功能。