相关疑难解决方法(0)

如何在PostgreSQL中使用RETURNING和ON CONFLICT?

我在PostgreSQL 9.5中有以下UPSERT:

INSERT INTO chats ("user", "contact", "name") 
           VALUES ($1, $2, $3), 
                  ($2, $1, NULL) 
ON CONFLICT("user", "contact") DO NOTHING
RETURNING id;
Run Code Online (Sandbox Code Playgroud)

如果没有冲突,则返回如下内容:

----------
    | id |
----------
  1 | 50 |
----------
  2 | 51 |
----------
Run Code Online (Sandbox Code Playgroud)

但如果存在冲突,则不会返回任何行:

----------
    | id |
----------
Run Code Online (Sandbox Code Playgroud)

id如果没有冲突,我想返回新列,或者返回id冲突列的现有列.
可以这样做吗?如果是这样,怎么样?

sql postgresql upsert sql-returning

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

什么是'$$'用于PL/pgSQL

作为PL/pgSQL的新手,这个函数中双美元符号的含义是什么:

CREATE OR REPLACE FUNCTION check_phone_number(text)
RETURNS boolean AS $$
BEGIN
  IF NOT $1 ~  e'^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$' THEN
    RAISE EXCEPTION 'Wrong formated string "%". Expected format is +999 999';
  END IF;
  RETURN true; 
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

我猜,在RETURNS boolean AS $$,$$是一个占位符.

最后一行有点神秘: $$ LANGUAGE plpgsql STRICT IMMUTABLE;

顺便说一句,最后一行是什么意思?

postgresql quotes plpgsql dollar-sign dollar-quoting

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

使用PL/pgSQL将多个字段作为PostgreSQL中的记录返回

我正在使用PL/pgSQL编写SP.
我想返回一个记录,由几个不同的表中的字段组成.看起来像这样:

CREATE OR REPLACE FUNCTION get_object_fields(name text)
  RETURNS RECORD AS $$
BEGIN
  -- fetch fields f1, f2 and f3 from table t1
  -- fetch fields f4, f5 from table t2
  -- fetch fields f6, f7 and f8 from table t3
  -- return fields f1 ... f8 as a record
END
$$ language plpgsql; 
Run Code Online (Sandbox Code Playgroud)

如何将不同表中的字段作为单个记录中的字段返回?

[编辑]

我已经意识到我上面给出的例子有点过于简单了.我需要检索的一些字段将被保存为要查询的数据库表中的单独行,但我想在"展平"记录结构中返回它们.

下面的代码应该有助于进一步说明:

CREATE TABLE user (id int, school_id int, name varchar(32));

CREATE TYPE my_type (
  user1_id   int,
  user1_name varchar(32),
  user2_id   int,
  user2_name varchar(32)
); …
Run Code Online (Sandbox Code Playgroud)

sql postgresql types stored-procedures plpgsql

64
推荐指数
4
解决办法
14万
查看次数

设置变量时,记录的IS NOT NULL测试不返回TRUE

使用plpgsql过程提取记录(如果存在),如果存在,则使用它执行某些操作.

变量是一个rowtype:

my_var my_table%rowtype;
Run Code Online (Sandbox Code Playgroud)

我用SQL语句填充它:

select * from my_table where owner_id = 6 into my_var;
Run Code Online (Sandbox Code Playgroud)

我知道它肯定有一行:

raise notice 'my_var is %', my_var;
Run Code Online (Sandbox Code Playgroud)

返回:

NOTICE:  my_var is (383,6,10)
Run Code Online (Sandbox Code Playgroud)

但是现在我想测试一下,如果条件失败,它会得到记录和两者:

if my_var is null then
  raise notice 'IT IS NULL';
end if;
if my_var is not null then
  raise notice 'IT IS NOT NULL';
end if;
Run Code Online (Sandbox Code Playgroud)

这些加注都没有出现在我的消息日志中 - 它只是从不进入块.如果你从一个行收到一行,测试的正确方法是SELECT * INTO什么?

sql postgresql null row plpgsql

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