我正在将一个庞大的表按计数汇总到一个新表中,在该表中我想将所有空字符串更改为NULL
,并同时对一些列进行类型转换。我通读了一些帖子,但找不到查询,这使我可以在单个查询中跨所有列进行查询,而无需使用多个语句。
让我知道是否可以遍历所有列,并将单元格替换为具有null的空字符串。
我有一个带有长文本列的表.我希望能够选择所有列但限制文本列而无需编写每一列.
select * from resources;
Run Code Online (Sandbox Code Playgroud)
产生的输出太长而无法在psql中正确显示.我可以通过使用substr()
或left()
在长列上显示某些内容,但之后我需要指定每列.
select id, left(data, 50), file_format_version, ... from resources;
Run Code Online (Sandbox Code Playgroud)
当我查询第一个时,是否有一种方法可以让psql默认截断长列select * from resources
?
PostgreSQL 10/11。
如果目标单元格值为 ,我需要删除行而不是更新null
。
所以我创建了这个触发函数:
CREATE OR REPLACE FUNCTION delete_on_update_related_table() RETURNS trigger
AS $$
DECLARE
refColumnName text = TG_ARGV[0];
BEGIN
IF TG_NARGS <> 1 THEN
RAISE EXCEPTION 'Trigger function expects 1 parameters, but got %', TG_NARGS;
END IF;
EXECUTE 'DELETE FROM ' || TG_TABLE_NAME || ' WHERE $1 = ''$2'''
USING refColumnName, OLD.id;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
还有一个BEFORE UPDATE
触发器:
CREATE OR REPLACE FUNCTION delete_on_update_related_table() RETURNS trigger
AS $$
DECLARE
refColumnName text = TG_ARGV[0];
BEGIN …
Run Code Online (Sandbox Code Playgroud) 我在PostgreSQL 文档中找不到是否有办法运行:ALTER TABLE tablename RENAME COLUMN IF EXISTS colname TO newcolname;
语句。
我很高兴我们可以,因为我面临的错误取决于谁制作并给了我一个 SQL 脚本,在某些情况下一切都很好(当列的名称错误时,名称实际上会被更改)使用RENAME
语句),而在其他情况下则不会(当列已经具有正确的名称时)。
因此,在尝试重命名IF EXISTS
列名时使用对列名的语句的想法。如果列已经有了正确的名称(此处cust_date_mean
),则应正确跳过必须仅应用于错误名称的重命名命令,并且不会发出以下错误:
db_1 | [223] ERROR: column "cust_mean" does not exist
db_1 | [223] STATEMENT: ALTER TABLE tablename RENAME COLUMN cust_mean TO cust_date_mean;
db_1 | ERROR: column "cust_mean" does not exist
Run Code Online (Sandbox Code Playgroud)
(与此同时,我将与团队澄清事情,因此,如果这样的命令不存在,那也没什么大不了的,但我认为它会有所帮助)。
我正在尝试动态分区Postgres中的日志条目.我有53个子表(每周有1个日志条目),并希望使用触发器将INSERT路由到子表.
我运行该函数INSERT INTO log5 VALUES (NEW.*)
,它的工作原理.
我用EXECUTE
语句运行函数,但它失败了.在EXECUTE
语句中,它识别NEW
为表名而不是传递给触发器函数的变量.有关如何修复的任何想法?谢谢!
错误:
QUERY:INSERT INTO log5 VALUES(NEW.*)
CONTEXT:PL/pgSQL函数log_roll_test()EXECUTE语句中的第6行
错误:缺少表"new"的FROM子句条目SQL状态:42P01
我的功能:
CREATE FUNCTION log_roll_test() RETURNS trigger AS $body$
DECLARE t text;
BEGIN
t := 'log' || extract(week FROM NEW.updt_ts); --child table name
--INSERT INTO log5 VALUES (NEW.*);
EXECUTE format('INSERT INTO %I VALUES (NEW.*);', t);
RETURN NULL;
END;
$body$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我的触发器:
CREATE TRIGGER log_roll_test
BEFORE INSERT ON log FOR EACH ROW
EXECUTE PROCEDURE log_roll_test();
Run Code Online (Sandbox Code Playgroud) 我有一个像这样组织的功能:
create function everything(waypoints waypoint)
returns table(node int, xy text array) as $$
BEGIN
create view results as ...
return query (select * from results);
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我有一个表,其中包含组织waypoint
数据类型结构的方式.此表未明确表示类型waypoint
本身.
该函数按原样创建,但是,我无法通过传入我的表来调用它:
select everything(waypoints);
要么 select everything(select * from temp);
但它表示select
前者和后面的语法错误或后者waypoints
不存在语法错误.
我该怎么办?
我在postgresql(版本9.4.4)中有一个相当复杂的功能,我需要一些帮助.
我在我的函数中声明了一个循环(下面有大量工作):
CREATE OR REPLACE function getRSI(
psymbol varchar,
pstarttime timestamp with time zone,
pendtime timestamp with time zone,
pduration double precision,
ptable varchar
)
RETURNS SETOF rsi AS
$BODY$
declare
row_data record;
-- some variables
begin
FOR row_data IN SELECT datetime, value FROM "4" WHERE symbol = 'AAPL'
AND datetime BETWEEN '2015-11-23 09:30:00 -0500' AND
'2015-11-23 15:59:59-0500' LOOP
-- enter code here
END LOOP;
end
$BODY$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
这很完美,我可以得到我的功能的结果,并让它为我的所有数字.
我想让循环像这样工作:
FOR row_data in select datetime, value from quote_ident(ptable)
where …
Run Code Online (Sandbox Code Playgroud) 使用 Postgres 13.1,我想对表的所有列应用前向填充函数。前向填充函数在我之前的问题中进行了解释:
但是,在这种情况下,列和表是指定的。我想获取该代码并将其应用于任意表,即。指定一个表,并将前向填充应用于每一列。
以此表为例:
CREATE TABLE example(row_num int, id int, str text, val integer);
INSERT INTO example VALUES
(1, 1, '1a', NULL)
, (2, 1, NULL, 1)
, (3, 2, '2a', 2)
, (4, 2, NULL, NULL)
, (5, 3, NULL, NULL)
, (6, 3, '3a', 31)
, (7, 3, NULL, NULL)
, (8, 3, NULL, 32)
, (9, 3, '3b', NULL)
, (10,3, NULL, NULL)
;
Run Code Online (Sandbox Code Playgroud)
我从该函数的以下工作基础开始。我称之为传递一些变量名。请注意,第一个是表名而不是列名。该函数获取表名并创建所有列名的数组,然后输出名称。
create or replace function col_collect(tbl text, …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用PL/pgSQL(PostgreSQL 9.3)实现一个函数,该函数返回一个与参数中的输入表具有相同结构的表.基本上,我想更新一个表,并使用plpgsql返回更新表的副本.我在SO周围搜索并发现了几个相关的问题(例如,返回动态表,其中包含来自PL/pgSQL函数的未知列和表名作为PostgreSQL函数参数),这导致了以下最小测试示例:
CREATE OR REPLACE FUNCTION change_val(_lookup_tbl regclass)
RETURNS _lookup_tbl%rowtype AS --problem line
$func$
BEGIN
RETURN QUERY EXECUTE format('UPDATE %s SET val = 2 RETURNING * ; ', _lookup_tbl);
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
但我不能拿过去给正确的返回类型TABLE
或SETOF RECORD
在problem line
.根据这个答案:
SQL要求在调用时知道返回类型
但我认为返回类型(我打算从输入表类型中借用)是已知的.有人可以帮助解释是否可以修复上述PL/pgSQL函数的签名?
注意,我需要参数化输入表并返回该表的更新.欢迎替代方案.
我已经找到了我要在Oracle和SQL Server上解决的问题的解决方案(我认为),但是似乎无法将其转换为Postgres解决方案。我正在使用Postgres 9.3.6。
这个想法是为了生成用于分析目的的有关表内容的“元数据”。这只能通过让每一列都运行查询来找出(例如...)最小/最大/计数值等来完成(AFAIK)。为了使过程自动化,最好让数据库生成查询,然后执行查询。
使用示例salesdata
表,我可以使用以下代码段为每列生成一个选择查询,并返回min()值:
SELECT 'SELECT min('||column_name||') as minval_'||column_name||' from salesdata '
FROM information_schema.columns
WHERE table_name = 'salesdata'
Run Code Online (Sandbox Code Playgroud)
优点是,无论列数如何,数据库都会生成代码。现在,我想到了无数个地方来存储这些查询,这些查询可以是某种变量,也可以是表列,其想法是执行这些查询。我想将生成的查询存储在变量中,然后使用EXECUTE
(或EXECUTE IMMEDIATE
)语句执行它们,这是此处采用的方法(请参见右窗格),但是Postgres不会让我在函数外部声明变量,因此我一直在抓挠我对如何将它们组合在一起,无论是什至是遵循的方向,也许还有更简单的东西。
您有任何指点吗,由于其他问题,我目前正在尝试类似的方法,但不知道我是否朝着正确的方向前进:
CREATE OR REPLACE FUNCTION foo()
RETURNS void AS
$$
DECLARE
dyn_sql text;
BEGIN
dyn_sql := SELECT 'SELECT min('||column_name||') from salesdata'
FROM information_schema.columns
WHERE table_name = 'salesdata';
execute dyn_sql
END
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud) postgresql dynamic-sql plpgsql aggregate-functions dynamic-queries
postgresql ×10
plpgsql ×8
dynamic-sql ×6
null ×2
triggers ×2
casting ×1
for-loop ×1
function ×1
polymorphism ×1
psql ×1
rename ×1
replace ×1
select ×1
sql ×1
string ×1