相关疑难解决方法(0)

用空值替换空字符串

我正在将一个庞大的表按计数汇总到一个新表中,在该表中我想将所有空字符串更改为NULL,并同时对一些列进行类型转换。我通读了一些帖子,但找不到查询,这使我可以在单个查询中跨所有列进行查询,而无需使用多个语句。

让我知道是否可以遍历所有列,并将单元格替换为具有null的空字符串。

参考:如何使用SQL Server将空格转换为空值?

string postgresql null replace plpgsql

4
推荐指数
1
解决办法
6574
查看次数

默认情况下在postgres psql select语句中截断显示

我有一个带有长文本列的表.我希望能够选择所有列但限制文本列而无需编写每一列.

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 select dynamic-sql psql

4
推荐指数
1
解决办法
3110
查看次数

触发| 如何删除行而不是根据单元格值更新

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 triggers plpgsql

4
推荐指数
1
解决办法
3032
查看次数

PostgreSQL 仅当列存在时才重命名该列

我在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)

(与此同时,我将与团队澄清事情,因此,如果这样的命令不存在,那也没什么大不了的,但我认为它会有所帮助)。

postgresql rename

4
推荐指数
1
解决办法
3592
查看次数

PostgreSQL 9.3触发函数插入到具有参数化名称的表中

我正在尝试动态分区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)

postgresql triggers dynamic-sql plpgsql

3
推荐指数
1
解决办法
2043
查看次数

如何将表参数传递给此函数?

我有一个像这样组织的功能:

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 casting plpgsql

3
推荐指数
1
解决办法
3016
查看次数

如何在postgresql函数中使用变量进行循环查询

我在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)

postgresql for-loop function dynamic-sql plpgsql

3
推荐指数
1
解决办法
5640
查看次数

将函数动态应用到 Postgres 表中的所有列

使用 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)

sql postgresql null dynamic-sql plpgsql

3
推荐指数
1
解决办法
1667
查看次数

如何在PL/pgSQL中按行类型返回表

我正在尝试使用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)

但我不能拿过去给正确的返回类型TABLESETOF RECORDproblem line.根据这个答案:

SQL要求在调用时知道返回类型

但我认为返回类型(我打算从输入表类型中借用)是已知的.有人可以帮助解释是否可以修复上述PL/pgSQL函数的签名?

注意,我需要参数化输入表并返回该表的更新.欢迎替代方案.

postgresql polymorphism dynamic-sql plpgsql

2
推荐指数
1
解决办法
1525
查看次数

在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

2
推荐指数
1
解决办法
1万
查看次数