相关疑难解决方法(0)

选择随机行PostgreSQL的最佳方法

我想在PostgreSQL中随机选择一行,我试过这个:

select * from table where random() < 0.01;
Run Code Online (Sandbox Code Playgroud)

但其他一些人推荐这个:

select * from table order by random() limit 1000;
Run Code Online (Sandbox Code Playgroud)

我有一个非常大的表,有5亿行,我希望它快.

哪种方法更好?有什么区别?选择随机行的最佳方法是什么?

sql random postgresql performance

311
推荐指数
9
解决办法
19万
查看次数

表名作为PostgreSQL函数参数

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

postgresql function dynamic-sql plpgsql identifier

69
推荐指数
4
解决办法
7万
查看次数

search_path如何影响标识符解析和"当前架构"

是否可以定义默认情况下创建新表的模式?(由"不合格的表名称"引用.)

我已经看到了在Postgres中使用"搜索路径"的一些细节,但我认为它只在检索数据时有效,而不是创建.

我有一堆SQL脚本,它们创建了许多表.我没有修改脚本,而是希望默认情况下在特定模式中设置数据库创建表 - 当它们具有非限定名称时.

这可能吗?

postgresql schema search-path database-table

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

在plpgsql函数中将表和列名定义为参数?

它必须简单,但我正在迈出Postgres函数的第一步,我找不到任何有效的东西......

我想创建一个修改表和/或列的函数,我找不到在我的函数中指定我的表和列作为参数的正确方法.

就像是:

CREATE OR REPLACE FUNCTION foo(t table)
RETURNS void AS $$
BEGIN
   alter table t add column c1 varchar(20);
   alter table t add column c2 varchar(20);
   alter table t add column c3 varchar(20);
   alter table t add column c4 varchar(20);
END;
$$ LANGUAGE PLPGSQL;

select foo(some_table)
Run Code Online (Sandbox Code Playgroud)

在另一种情况下,我想要一个改变某个表中某个列的函数:

CREATE OR REPLACE FUNCTION foo(t table, c column)
RETURNS void AS $$
BEGIN
   UPDATE t SET c = "This is a test";
END;
$$ LANGUAGE PLPGSQL;
Run Code Online (Sandbox Code Playgroud)

有可能吗?

postgresql variables function dynamic-sql plpgsql

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

如果存在行则返回id,否则返回INSERT

我正在node.js中编写一个函数来查询PostgreSQL表.
如果该行存在,我想从该行返回id列.
如果它不存在,我想插入它并返回id(insert into ... returning id).

我一直在尝试变体caseif else语句,似乎无法让它发挥作用.

sql postgresql node.js sql-insert

10
推荐指数
2
解决办法
7283
查看次数

如何在PostgreSQL 8.2中动态使用TG_TABLE_NAME?

我试图在PostgreSQL 8.2中编写一个触发器函数,它将动态使用TG_TABLE_NAME来生成和执行SQL语句.我可以为PostgreSQL的更高版本找到各种各样的例子,但由于一些要求,我被困在8.2上.这是我的功能,因为它有效,但几乎没有动态:

CREATE OR REPLACE FUNCTION cdc_TABLENAME_function() RETURNS trigger AS $cdc_function$
        DECLARE 
        op  cdc_operation_enum;
    BEGIN
        op = TG_OP;

        IF (TG_WHEN = 'BEFORE') THEN
            IF (TG_OP = 'UPDATE') THEN
                op = 'UPDATE_BEFORE';
            END IF;

            INSERT INTO cdc_test VALUES (DEFAULT,DEFAULT,op,DEFAULT,DEFAULT,OLD.*); 
        ELSE
            IF (TG_OP = 'UPDATE') THEN
                op = 'UPDATE_AFTER';
            END IF;

            INSERT INTO cdc_test VALUES (DEFAULT,DEFAULT,op,DEFAULT,DEFAULT,NEW.*); 
        END IF;

        IF (TG_OP = 'DELETE') THEN
            RETURN OLD;
        ELSE
            RETURN NEW;
        END IF;
    END;
Run Code Online (Sandbox Code Playgroud)

这是当前编写的方式,我将不得不为每个表编写一个单独的触发器函数.我想使用TG_TABLE_NAME来动态构建我的INSERT语句,并在其前面加上'cdc_',因为所有表都遵循相同的命名约定.然后我可以让每个表调用的每个触发器只有一个函数.

sql postgresql triggers function plpgsql

6
推荐指数
1
解决办法
8878
查看次数

左连接,从列派生的动态表名

我是PostgreSQL的新手,我想知道是否可以使用numbertable tbc作为左连接中表名的一部分'pa' || number.因此,例如,如果数字是456887,我想要与表pa456887左连接.像这样的东西:

SELECT tdc.cpa, substring(tdc.ku,'[0-9]+') AS number, paTab.vym 
FROM public."table_data_C" AS tdc
LEFT JOIN concat('pa' || number) AS paTab ON (paTab.cpa = tdc.cpa)
Run Code Online (Sandbox Code Playgroud)

我只想使用PostgreSQL,而不是PHP中的其他代码.

sql postgresql dynamic dynamic-sql tablename

6
推荐指数
1
解决办法
5199
查看次数

SELECT ... INTO的EXECUTE未实现

我试图在PostrgeSQL中运行此函数:

CREATE OR REPLACE FUNCTION create_partition_and_insert()
RETURNS trigger AS
$BODY$
DECLARE
partition VARCHAR(25);
_date text;
BEGIN
EXECUTE 'SELECT REPLACE(' || quote_literal(NEW.date) || ',''-'',''_'') into _date';
partition := TG_RELNAME || '_' || _date || ‘p’;
IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname=partition) THEN
RAISE NOTICE 'A partition has been created %',partition;
EXECUTE 'CREATE TABLE ' || partition || ' (check (date = ''' || NEW.date || ''')) INHERITS (' || TG_RELNAME || ');';
END IF;
EXECUTE 'INSERT INTO ' || …
Run Code Online (Sandbox Code Playgroud)

postgresql triggers partitioning dynamic-sql plpgsql

6
推荐指数
1
解决办法
4004
查看次数

如何在每列上执行相同的聚合,而不列出列?

我有一个N列的表.让我们给他们打电话c1,c2,c3,c4,... cN.在多行中,我希望COUNT DISTINCT(cX)在[1,N]中为每个X 获得一行.

c1 | c2 | ... | cn
0  | 4  | ... | 1
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以这样做(在存储过程中),而无需手动将每个列名写入查询?

为什么?

我们遇到了一个问题,即应用程序服务器中的错误意味着我们会在以后插入垃圾时重写好的列值.为了解决这个问题,我正在存储信息日志结构,其中每一行代表一个逻辑UPDATE查询.然后,当给出记录完成的信号时,我可以确定是否(错误地)覆盖了任何值.

多行中单个正确记录的示例:每列最多有一个值.

| id | initialize_time | start_time | end_time |
| 1  | 12:00am         | NULL       | NULL     |
| 1  | 12:00am         | 1:00pm     | NULL     |
| 1  | 12:00am         | NULL       | 2:00pm   |

Reconciled row:
| 1  | 12:00am         | …
Run Code Online (Sandbox Code Playgroud)

sql database postgresql relational-database

5
推荐指数
1
解决办法
470
查看次数

使用数组的Postgres格式字符串

我正在寻找一种使用数组格式化字符串的简单方法,如下所示:

select format_using_array('Hello %s and %s', ARRAY['Jane', 'Joe']);

 format_using_array
--------------------
Hello Jane and Joe
(1 row)
Run Code Online (Sandbox Code Playgroud)

有一个格式函数,但它需要显式参数,我不知道数组中有多少项.我提出了这样的功能:

CREATE FUNCTION format_using_array(fmt text, arr anyarray) RETURNS text
    LANGUAGE plpgsql
AS $$
    declare 
        t text;
        length integer;
    begin
        length := array_length(arr, 1);
        t := fmt;
        for i in 1..length loop
           t := regexp_replace(t, '%s', arr[i]);
        end loop;

        return t;
    end
$$;
Run Code Online (Sandbox Code Playgroud)

但也许有一种我不知道的简单方法,这是我使用pgsql的第一天.

arrays format postgresql

5
推荐指数
1
解决办法
5521
查看次数