Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IF语句中的Postgresql 12 EXECUTE语句引发语法错误_Sql_Postgresql - Fatal编程技术网

IF语句中的Postgresql 12 EXECUTE语句引发语法错误

IF语句中的Postgresql 12 EXECUTE语句引发语法错误,sql,postgresql,Sql,Postgresql,我正在使用PostgreSQL v12 我想动态更新表的列值 其中,列名称和值被指定给其他表 塔吉特表 | key | A | B | C | D | E| |k1 | N | N | N | N| |k2 | N | N | N | N| |k3 | N | N | N | N| 其他表格 |键|列|名称|值| |k1 | A | 3| |k2 | B | 2| |k2 | C | 1| 我要做的是更新目标表,如下所示 | key | A | B | C | D | E| |k1 | 3

我正在使用PostgreSQL v12

我想动态更新表的列值 其中,列名称和值被指定给其他表

塔吉特表

| key | A | B | C | D | E|
|k1 | N | N | N | N|
|k2 | N | N | N | N|
|k3 | N | N | N | N|
其他表格

|键|列|名称|值|
|k1 | A | 3|
|k2 | B | 2|
|k2 | C | 1|
我要做的是更新目标表,如下所示

| key | A | B | C | D | E|
|k1 | 3 | N | N | N|
|k2 | N | 2 | 1 | N | N|
|k3 | N | N | N | N|
  • 目标表和其他表已给定,因此无法修改表结构

  • 我是sql的新手

  • 我在postgresql v11上运行了这个查询,它运行正常,但在v12上引发了syntex错误

  • 选择upadate_func();
    
    它引起如下错误

    错误:在“IF”处或附近出现语法错误

    如果报表运行良好,则打印


    怎么了

    SQL中没有
    IF
    。SQL中有
    case当
    construct时。那么为什么IF语句在没有执行的情况下运行良好?那么给定的代码是否可以替换“IF..Then..end IF”到“case when..Then..end case”?Postgres execute语句的格式是“执行。SQL语句不能以IF开头,甚至不能在文本中包含IF。如果。。。EXECUTE有效,因为IF是有效的plpgsql语句。至于更改为CASE,也不能开始sql语句。您必须始终记住,在代码的当前状态下,您的语句在两种语言(SQL或plpgsql)中的哪一种是有效的。
    
    CREATE OR REPLACE FUNCTION upadate_func()
      RETURNS void AS
    $BODY$ 
    DECLARE 
      r table1%rowtype; 
      lr text; 
    BEGIN 
      -- r is a structure that contains an element for each column in the select  list
      FOR r IN select * from table1 
    LOOP 
    lr := LOWER(r.item); 
    EXECUTE 'IF ' || '''' || lr || '''' || ' IN (SELECT item FROM table2) THEN' || 
            ' UPDATE table3' || 
            ' SET ' || lr || ' = ' || r.value || 
            ' WHERE key = ' || '''' || r.key || '''' || 
            ' AND date1 = ' || 'CAST(' || '''' || r.date1 || '''' || ' AS TIMESTAMP)' || 
            ' AND datafmt = ' || '''' || r.datafmt || '''' || 
            ' AND date2 >= '|| 'CAST(' || '''' || r.date2 || '''' || ' AS TIMESTAMP);' || 
            ' END IF;'; 
    END LOOP; 
    END 
    $BODY$ 
    LANGUAGE plpgsql;