相关疑难解决方法(0)

标签中的最大字符数(表名,列等)

希望以前没有问过这个问题.有谁知道域名的字符限制?例如,如果我写这个:

CREATE DOMAIN d_complement_activite_etablissement AS character varying
Run Code Online (Sandbox Code Playgroud)

它将创建一个名称为的域:

d_complement_activite_etabliss
Run Code Online (Sandbox Code Playgroud)

(是的,我知道如何计算,但我想要更多关于这个主题的信息).

是否有可以更改此最大长度的命令?其他名称(列,表等)的长度是否相同?

postgresql identifier keyword

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

重构PL/pgSQL函数以返回各种SELECT查询的输出

我写了一个函数,输出一个SELECT以文本形式组成的PostgreSQL 查询.现在我不想再输出文本,但实际上SELECT对数据库运行生成的语句并返回结果 - 就像查询本身一样.

到目前为止我所拥有的:

CREATE OR REPLACE FUNCTION data_of(integer)
  RETURNS text AS
$BODY$
DECLARE
   sensors varchar(100);   -- holds list of column names
   type    varchar(100);   -- holds name of table
   result  text;           -- holds SQL query
       -- declare more variables

BEGIN
      -- do some crazy stuff

      result := 'SELECT\r\nDatahora,' || sensors ||
      '\r\n\r\nFROM\r\n' || type ||
      '\r\n\r\nWHERE\r\id=' || $1 ||'\r\n\r\nORDER BY Datahora;';

      RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION data_of(integer) OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

sensors …

sql database postgresql dynamic-sql plpgsql

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

在触发器函数中使用动态表名INSERT

我不确定如何实现以下内容:

CREATE OR REPLACE FUNCTION fnJobQueueBEFORE() RETURNS trigger AS $$
    DECLARE
        shadowname varchar := TG_TABLE_NAME || 'shadow';
    BEGIN
        INSERT INTO shadowname VALUES(OLD.*);
        RETURN OLD;
    END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

即将值插入到具有动态生成名称的表中.
执行上面的代码会产生:

ERROR:  relation "shadowname" does not exist
LINE 1: INSERT INTO shadowname VALUES(OLD.*)
Run Code Online (Sandbox Code Playgroud)

它似乎表明变量不会作为表名扩展/允许.我在Postgres手册中没有发现这个.

我已经尝试过EXECUTE这样的事情:

  EXECUTE 'INSERT INTO ' || quote_ident(shadowname) || ' VALUES ' || OLD.*;
Run Code Online (Sandbox Code Playgroud)

但没有运气:

ERROR:  syntax error at or near ","
LINE 1: INSERT INTO personenshadow VALUES (1,sven,,,)
Run Code Online (Sandbox Code Playgroud)

RECORD类型似乎失去了:OLD.*似乎被转换为字符串,并得到的重新解析,导致各种各样的类型的问题(例如NULL值). …

postgresql triggers dynamic-sql plpgsql

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

在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万
查看次数

SELECT*FROM有快捷方式吗?

psql控制台中有许多有用的快捷方式,如\d\l.
我想知道有一个SELECT * FROM table_name吗?
我经常将这个查询用于学习目的,所以不必一直写select * from ....

sql postgresql syntax psql

11
推荐指数
1
解决办法
3061
查看次数

如何在加入/推送到外部服务器之前强制评估子查询

假设我想查询一个带有几个WHERE过滤器的大表。我正在使用 Postgres 11 和外部表;外部数据包装器 (FDW) 是clickhouse_fdw. 但我也对通用解决方案感兴趣。

我可以这样做:

SELECT id,c1,c2,c3 from big_table where id=3 and c1=2
Run Code Online (Sandbox Code Playgroud)

我的 FDW 能够对远程外部数据源进行过滤,确保上述查询快速并且不会拉取太多数据。

如果我写的话上面的效果是一样的:

SELECT id,c1,c2,c3 from big_table where id IN (3,4,5) and c1=2
Run Code Online (Sandbox Code Playgroud)

即所有的过滤都被发送到下游。

但是,如果我尝试执行的过滤稍微复杂一些:

SELECT bt.id,bt.c1,bt.c2,bt.c3
from big_table bt
join lookup_table l on bt.id=l.id
where c1=2 and l.x=5
Run Code Online (Sandbox Code Playgroud)

然后查询规划器决定远程过滤c1=2,但在本地应用另一个过滤器。

在我的用例中,先计算哪些ids 有l.x=5,然后将其发送出去进行远程过滤会快得多,所以我尝试按以下方式编写:

SELECT id,c1,c2,c3
from big_table
where c1=2
and id IN (select id from lookup_table where x=5)
Run Code Online (Sandbox Code Playgroud)

big_table然而,查询规划器仍然决定在本地对satisfy的所有结果执行第二个过滤器c1=2,这非常慢。

有什么方法可以“强制”(select …

sql postgresql sql-execution-plan postgresql-performance foreign-data-wrapper

7
推荐指数
1
解决办法
1948
查看次数