我想在Postgres函数中传递一个表名作为参数.我试过这段代码:
CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer
AS $$
BEGIN
IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
return 1;
END IF;
return 0;
END;
$$ LANGUAGE plpgsql;
select some_f('table_name');
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
ERROR: syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
^
********** Error **********
ERROR: syntax error at or near "."
Run Code Online (Sandbox Code Playgroud)
以下是更改为此时出现的错误select * from quote_ident($1) tab where tab.id=1:
ERROR: column tab.id does not exist
LINE 1: ...T EXISTS …Run Code Online (Sandbox Code Playgroud) 我是Postgres的新手,拥有一个具有相同结构的多个表的数据库.我需要从每个表中选择符合特定条件的数据.
我可以通过一堆UNION查询来做到这一点,但是我需要搜索的表的数量会随着时间的推移而改变,所以我不想像那样硬编码.我一直在尝试开发一个循环遍历特定表的函数(它们有一个共同的命名约定)并返回一个记录表,但是当我查询函数时,我没有得到任何结果.功能代码如下:
CREATE OR REPLACE FUNCTION public.internalid_formaltable_name_lookup()
RETURNS TABLE(natural_id text, name text, natural_id_numeric text) AS
$BODY$
DECLARE
formal_table text;
begin
FOR formal_table IN
select table_name from information_schema.tables
where table_schema = 'public' and table_name like 'formaltable%'
LOOP
EXECUTE 'SELECT natural_id, name, natural_id_numeric
FROM ' || formal_table ||
' WHERE natural_id_numeric IN (
select natural_id_numeric from internal_idlookup
where internal_id = ''7166571'')';
RETURN NEXT;
END LOOP;
Return;
END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我尝试使用该函数时没有收到任何错误,但它没有返回任何行:
SELECT * From internalid_formaltable_name_lookup();
Run Code Online (Sandbox Code Playgroud)
知道我哪里错了吗?
postgresql for-loop dynamic-sql plpgsql set-returning-functions
我的数据库基于客户端分成模式(即:每个客户端都有自己的模式,具有相同的数据结构).
我也碰巧有一个外部动作,不知道它应该针对哪个架构.它来自系统的另一部分,它没有客户端的概念,也不知道它在哪个客户端设置中运行.在我处理它之前,我必须找出请求需要定位的模式
为了找到正确的模式,我必须找出哪个包含R特定唯一ID 的记录(字符串)
从我的理解,以下
SET search_path TO schema1,schema2,schema3,...
Run Code Online (Sandbox Code Playgroud)
将只查看schema1中的表(或与表匹配的第一个模式),并且不会进行全局搜索.
有没有办法让我在所有模式中进行全局搜索,或者我只需要使用for循环并迭代所有模式,一次一个?
我有一个PostgreSQL数据库,其中包含一些模式,如下所示:
My_Database
|-> Schemas
|-> AccountA
|-> AccountB
|-> AccountC
|-> AccountD
|-> AccountE
.
.
.
|-> AccountZ
Run Code Online (Sandbox Code Playgroud)
所有的模式都有一个名为表product具有称为列title.我想知道是否可以执行select语句来检索具有特定条件的所有模式的所有记录.
我到目前为止找到的唯一方法是按帐户运行查询帐户,如下所示.
SET search_path TO AccountA;
SELECT title FROM product WHERE title ILIKE '%test%';
Run Code Online (Sandbox Code Playgroud)
模式是动态创建的,因此我不知道它们的名称或存在多少名称.
是否可以在 Postgres 中执行以下操作:
SELECT column_name FROM information_schema WHERE table_name = 'somereport' AND data_type = 'integer';
SELECT SUM(coulmn_name[0]),SUM(coulmn_name[1]) ,SUM(coulmn_name[3]) FROM somereport;
Run Code Online (Sandbox Code Playgroud)
换句话说,我需要根据特定条件从表中选择一组列,然后对表中的每一列求和。
我知道我可以在循环中执行此操作,因此我可以独立计算每个列,但显然这需要对从信息模式查询返回的每个列进行查询。例如:
FOR r IN select column_name from information_schema where report_view_name = 'somereport' and data_type = 'integer';
LOOP
SELECT SUM(r.column_name) FROM somereport;
END
Run Code Online (Sandbox Code Playgroud) postgresql ×5
dynamic-sql ×3
plpgsql ×3
sql ×3
django ×1
for-loop ×1
function ×1
identifier ×1
inheritance ×1