我在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冲突列的现有列.
可以这样做吗?如果是这样,怎么样?
作为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;
顺便说一句,最后一行是什么意思?
我正在使用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) 使用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什么?