相关疑难解决方法(0)

PostgreSQL:创建表,如果不存在AS

我正在使用PostgreSQL并且是一个SQL初学者.我正在尝试从查询中创建一个表,如果我运行:

CREATE TABLE table_name AS
   (....query...)
Run Code Online (Sandbox Code Playgroud)

它工作得很好.但是如果我添加'if not exists'并运行:

CREATE TABLE IF NOT EXISTS table_name AS
   (....query...)
Run Code Online (Sandbox Code Playgroud)

使用完全相同的查询,我得到:

ERROR: syntax error at or near "as"
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

sql postgresql create-table

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

处理PostgreSQL异常的优雅方式?

在PostgreSQL中,我想创建一个安全包装机制,如果发生异常,它将返回空结果.考虑以下:

SELECT * FROM myschema.mytable;
Run Code Online (Sandbox Code Playgroud)

我可以在客户端应用程序中进行安全包装:

try {
    result = execute_query('SELECT value FROM myschema.mytable').fetchall();
}
catch(pg_exception) {
    result = []
}
Run Code Online (Sandbox Code Playgroud)

但我可以直接在SQL中做这样的事情吗?我想使下面的代码工作,但似乎它应该被放入DO $$ ... $$块中,在这里我迷路了.

BEGIN
    SELECT * FROM myschema.mytable;
EXCEPTION WHEN others THEN
    SELECT unnest(ARRAY[]::TEXT[])
END
Run Code Online (Sandbox Code Playgroud)

sql postgresql exception-handling dynamic-sql plpgsql

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

在PL/pgSQL中声明行类型变量

正如我发现的SELECT * FROM t INTO my_data;作品只有:

DO $$
DECLARE
my_data t%ROWTYPE;
BEGIN
SELECT * FROM t INTO my_data WHERE id = ?;
END $$;
Run Code Online (Sandbox Code Playgroud)

我对吗?

如果我想只获得2-3列而不是所有列.我该如何定义my_data

那是,

DO $$
DECLARE
my_data <WHAT HERE??>;
BEGIN
SELECT id,name,surname FROM t INTO my_data WHERE id = ?;
END $$;
Run Code Online (Sandbox Code Playgroud)

postgresql types plpgsql declare select-into

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

如何递归地找到两个表之间的相交地理位置

我正在运行Postgres 9.6.1和PostGIS 2.3.0 r15146并且有两个表.
geographies可能有150,000,000行,paths可能有10,000,000行:

CREATE TABLE paths (id uuid NOT NULL, path path NOT NULL, PRIMARY KEY (id))
CREATE TABLE geographies (id uuid NOT NULL, geography geography NOT NULL, PRIMARY KEY (id))
Run Code Online (Sandbox Code Playgroud)

给定一个数组/套ids的表geographies,什么是查找所有交叉路径与几何的"最佳"的方式?

换句话说,如果一个初始geography有一个相应的交叉,path我们还需要找到这个相交的所有其他 .从那里,我们需要找到这些新发现的所有其他相交,依此类推,直到我们找到所有可能的交叉点.geographiespathpathsgeographies

初始地理标识(我们的输入)可以是0到700之间的任何位置.平均值大约为40.
最小交叉点将为0,最大值将为大约1000.平均值可能大约为20,通常小于100连接.

我创建了一个这样做的功能,但我是PostGIS中的GIS和Postgres的新手.我发布了我的解决方案作为这个问题的答案.

我觉得应该有比我想出的更有说服力和更快速的方式.

sql gis postgresql postgis sqlgeography

17
推荐指数
1
解决办法
1631
查看次数

删除postgres中共享相同前缀的所有表

我想使用一个sql命令/查询从同一个数据库中删除所有共享相同前缀('supenh_agk')的表.

sql postgresql dynamic-sql plpgsql

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

将表名前置到SQL结果集中的每一列?(Postgres具体)

如何获取结果集中每列的标签,以便在其表中添加名称?

我希望在单个表和连接上进行查询时发生这种情况.

例:

  SELECT first_name, last_name FROM person;
Run Code Online (Sandbox Code Playgroud)

我希望结果如下:

 | person.first_name | person.last_name |
 |-------------------|------------------|
 | Wendy             | Melvoin          |
 | Lisa              | Coleman          |
Run Code Online (Sandbox Code Playgroud)

我可以使用"AS"为每列定义别名,但这将是乏味的.我希望这会自动发生.

  SELECT first_name AS person.first_name, last_name AS person.last_name FROM person;
Run Code Online (Sandbox Code Playgroud)

我的问题的原因是我使用的数据库驱动程序不提供元数据,通知我结果集获取其数据的数据库列.我正在尝试编写通用代码来处理结果集.

我想知道如何在SQL中执行此操作,或者至少在Postgres中.

SQLite有这样一个功能,虽然我看到它现在被莫名其妙地弃用了.SQLite有两个pragma设置:full_column_namesshort_column_names.

sql postgresql dynamic-sql identifier sql-view

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

循环并从多个表中选择数据的函数

我是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

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

如何使用 R 列出 Postgres 数据库中的表但不列出视图?

?DBI::dbListTables我们可以读到:

这应该包括视图和临时对象

确实如此。

我怎样才能只看到表格,不包括视图?

RPostgres::Postgres()如果重要的话我正在使用驱动程序。

postgresql r dbi

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

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

如果 psql 函数和调用函数中存在则截断

我有以下代码来创建一个函数,web_channel2如果表不为空,则截断表中的所有行:

create or replace function truncate_if_exists(tablename text)
returns void language plpgsql as $$
begin
    select
    from information_schema.tables 
    where table_name = tablename;
    if found then
        execute format('truncate %I', tablename);
    end if;
end $$;
Run Code Online (Sandbox Code Playgroud)

不幸的是我不知道应该如何继续...如何执行该函数?

sql postgresql truncate plpgsql search-path

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