postgresql - 如何在 PostgreSQL 中克隆记录

标签 postgresql plpgsql dynamic-sql composite-types

我想循环查询,但也保留下一个循环的实际记录,这样我就可以比较两个相邻的行。

CREATE OR REPLACE FUNCTION public.test ()
  RETURNS void AS
$body$
    DECLARE
      previous RECORD;
      actual RECORD;
      query TEXT;
      isdistinct BOOLEAN;
      tablename VARCHAR;
      columnname VARCHAR;
      firstrow BOOLEAN DEFAULT TRUE;
    BEGIN
      tablename = 'naplo.esemeny';
      columnname = 'esemeny_id';
      query = 'SELECT * FROM ' || tablename || ' LIMIT 2';
      FOR actual IN EXECUTE query LOOP
        --do stuff
        --save previous record
        IF NOT firstrow THEN
          EXECUTE 'SELECT ($1).' || columnname || ' IS DISTINCT FROM ($2).' || columnname 
            INTO isdistinct USING previous, actual;
          RAISE NOTICE 'previous: %', previous.esemeny_id;
          RAISE NOTICE 'actual: %', actual.esemeny_id;        
          RAISE NOTICE 'isdistinct: %', isdistinct; 
        ELSE
          firstrow = false;           
        END IF;
        previous = actual;
      END LOOP;
      RETURN;
    END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

表格:

CREATE TABLE naplo.esemeny (
  esemeny_id SERIAL,
  felhasznalo_id VARCHAR DEFAULT "current_user"() NOT NULL,
  kotesszam VARCHAR(10),
  idegen_azonosito INTEGER,
  esemenytipus_id VARCHAR(10),
  letrehozva TIMESTAMP WITHOUT TIME ZONE DEFAULT now() NOT NULL,
  szoveg VARCHAR,
  munkalap_id VARCHAR(13),
  ajanlat_id INTEGER,
  CONSTRAINT esemeny_pkey PRIMARY KEY(esemeny_id),
  CONSTRAINT esemeny_fk_esemenytipus FOREIGN KEY (esemenytipus_id)
    REFERENCES naplo.esemenytipus(esemenytipus_id)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT
    NOT DEFERRABLE
) 
WITH (oids = true);

上面的代码不起作用,抛出以下错误消息:

ERROR:  could not identify column "esemeny_id" in record data type
LINE 1: SELECT ($1).esemeny_id IS DISTINCT FROM ($2).esemeny_id
                ^
QUERY:  SELECT ($1).esemeny_id IS DISTINCT FROM ($2).esemeny_id
CONTEXT:  PL/pgSQL function "test" line 18 at EXECUTE statement
LOG:  duration: 0.000 ms  statement: SET DateStyle TO 'ISO'

我错过了什么?

免责声明:我知道代码没有太大意义,我创建代码只是为了演示问题。

最佳答案

这并不能直接回答您的问题,并且可能根本没有用,因为您没有真正描述您的最终目标。

如果最终目标是能够将当前行中的列的值与前一行中同一列的值进行比较,那么使用窗口查询可能会更好:

SELECT actual, previous
FROM (
    SELECT mycolumn AS actual,
        lag(mycolumn) OVER () AS previous
    FROM mytable
    ORDER BY somecriteria
) as q
WHERE previous IS NOT NULL 
    AND actual IS DISTINCT FROM previous

此示例打印当前行与上一行不同的行。

请注意,我添加了一个 ORDER BY 子句 - 在不指定顺序的情况下谈论“前一行”是没有意义的,否则您将得到随机结果。

这是普通 SQL,而不是 PlPgSQL,但如果您想动态生成查询,可以将其包装在函数中。

关于postgresql - 如何在 PostgreSQL 中克隆记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25776613/

相关文章:

sql - 为查询字符串声明变量

java - 从 Java 调用 PostgreSQL 函数

python - 为什么它抛出`GeoDjango Postgis 要求不满足在运行迁移时出现错误?

sql - 查找与列关联最密切的其他行

postgresql - 在 Postgres 中使用 dblink 有什么捷径吗?

postgresql - 如何从 postgresql 中的 plpgsql 函数返回的 SELECT 查询中提取字符串(或文本)?

postgresql - 在 Postgres 9.0+ 中使用 PL/pgSQL 循环表

mysql - 在数组上过滤具有列条件的行

sql-server - 动态 SQL 命令未执行

php - Datatables postgres重复行分页