我需要一种方法来测试给定数组中是否存在值.到目前为止,我想出了类似的东西
select '{1,2,3}'::int[] @> (ARRAY[]::int[] || value_variable::int)
Run Code Online (Sandbox Code Playgroud)
但我一直认为应该有一个更简单的方法,我只是看不到它.
编辑:刚认识到我能做到这一点
select '{1,2,3}'::int[] @> ARRAY[value_variable::int]
Run Code Online (Sandbox Code Playgroud)
这要好得多,我相信这已经足够了,但如果你有其他方法可以做,请分享.
我是postgres的新手,我正在完成我的任务.我不得不创建一个只有1列的表,然后我得到了这个声明在pgadmin III上运行:
BEGIN;
INSERT INTO mytable VALUES (1);
SAVEPOINT savepoint1;
INSERT INTO mytable VALUES (2);
ROLLBACK TO SAVEPOINT savepoint1;
INSERT INTO mytable VALUES (3);
SAVEPOINT savepoint2;
INSERT INTO mytable VALUES (4);
INSERT INTO mytable VALUES (5);
SAVEPOINT savepoint3;
SELECT * FROM mytable;
--NOTE: You need to run this IF statement as PGScript
--(button next to the normal run button)
IF (CAST ((SELECT MAX(id) FROM mytable) AS INTEGER) = 4)
BEGIN
RELEASE SAVEPOINT savepoint2;
END
ELSE
BEGIN
INSERT INTO mytable VALUES(6); …Run Code Online (Sandbox Code Playgroud) 我在postgres中编写存储过程,我需要检查是否存在行,然后相应地执行操作.沿线的东西.
IF SELECT * FROM foo WHERE x = 'abc' AND y = 'xyz' THEN
-- do something here
ELSE
-- do something else
END;
Run Code Online (Sandbox Code Playgroud)
我谷歌搜索了一下,但没有得到很好的点击.
我在我的数据库中有这个功能:
CREATE OR REPLACE FUNCTION "insertarNuevoArticulo"(nombrearticulo character varying, descripcion text, idtipo integer, idfamilia bigint, artstock integer, minstock integer, maxstock integer, idmarca bigint, precio real, marcastock integer)
RETURNS boolean AS
$BODY$
DECLARE
articulo "Articulo"%ROWTYPE;
BEGIN
SELECT * INTO articulo FROM "Articulo" WHERE "Nombre" = $1 AND "idTipo"=$3 AND "idFamilia"=$4;
IF NOT FOUND THEN
INSERT INTO "Articulo" ("Nombre", "Descripcion", "idTipo", "idFamilia", "Stock", "MinStock", "MaxStock") Values ($1, $2, $3, $4, $5, $6, $7);
SELECT last_value
INTO articulo."idArticulo"
FROM "public"."Articulo_idArticulo_seq";
END IF;
SELECT * …Run Code Online (Sandbox Code Playgroud) 我有一个函数registration(),它应该在某些情况下向表添加一行.我已经包含了一段代码和来自通话的输出.
如果select *返回一个非空表行(它根据它执行RAISE NOTICE),我想引发异常而不添加行.该示例似乎表明它rowt不是null,但仍然rowt IS NOT NULL返回f(并且不会引发异常).
我希望这是我看不到的小事.
select * into rowt from Email where email_email = eml;
RAISE NOTICE '%, rowt IS NOT NULL:%',rowt, rowt IS NOT NULL;
if rowt IS NOT NULL THEN
RAISE EXCEPTION 'email address, %, already registered.' , eml;
END IF;
Run Code Online (Sandbox Code Playgroud)
输出:
NOTICE: (7,,,), rowt IS NOT NULL:f
registration
--------------
21
(1 row)
CREATE TABLE IF NOT EXISTS Email (
email_email VARCHAR(50) NOT …Run Code Online (Sandbox Code Playgroud) 我有以下代码来创建一个函数,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)
不幸的是我不知道应该如何继续...如何执行该函数?
我有一个带有主表的数据库"DB_One",上面t_d_gate_out有8个索引.我创建了另一个带分区的数据库t_d_gate_out(让我们称之为"DB_Two").:它是由年份和月份(子表的例子分区t_d_gate_out09-2013有两个索引)(d _gate_out和每个孩子新列:i_trx_own)
这是我创建和插入子表的功能:
CREATE OR REPLACE FUNCTION ctm_test.gateout_partition_function()
RETURNS trigger AS
$BODY$
DECLARE new_time text;
tablename text;
seqname text;
seqname_schema text;
bulantahun text;
bulan text;
bulan2 text;
tahun text;
enddate text;
result record;
BEGIN new_time := to_char(NEW.d_gate_out,'MM-YYYY');
bulan:=to_char(NEW.d_gate_out,'MM');
bulan2:=extract(month from NEW.d_gate_out);
tahun:=to_char(NEW.d_gate_out,'YYYY');
bulantahun := new_time;
tablename := 't_d_gate_out'||bulantahun;
seqname := 't_d_gate_out'||bulantahun||'_seq';
seqname_schema := 'ctm_test.t_d_gate_out'||bulantahun||'_seq';
PERFORM 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE
c.relkind = 'r' AND …Run Code Online (Sandbox Code Playgroud) 我正在尝试检查将要插入系统的房间在该日期是否已经租用。我已经考虑过计算与房间号和日期匹配的行,然后回滚事务。但是我收到以下错误,即使我已经更改了代码以引发用户定义的异常:
Run Code Online (Sandbox Code Playgroud)ERROR: cannot begin/end transactions in PL/pgSQL HINT: Use a BEGIN block with an EXCEPTION clause instead. CONTEXT: PL/pgSQL function "checkRoom"() line 17 at SQL statement
CREATE OR REPLACE FUNCTION "checkRoom"() RETURNS TRIGGER AS
$BODY$
DECLARE
counter integer;
BEGIN
SELECT COUNT("num_sesion")
FROM "Sesion"
INTO counter
WHERE "Room_Name"=NEW."Room_Name" AND "Date"=NEW."Date";
IF (counter> 0) THEN -- Probably counter>1 as it's triggered after the transaction..
raise notice 'THERE'S A ROOM ALREADY!!';
raise exception 'The room is rented at that date';
END IF;
RETURN …Run Code Online (Sandbox Code Playgroud) postgresql ×8
plpgsql ×5
sql ×3
arrays ×1
exists ×1
function ×1
if-statement ×1
indexing ×1
null ×1
partitioning ×1
row ×1
search-path ×1
select-into ×1
triggers ×1
truncate ×1