一尘不染

如果存在一行,则返回ID,否则返回INSERT

sql

我在node.js中编写一个函数来查询PostgreSQL表。
如果该行存在,我想从该行返回id列。
如果不存在,我想将其插入并返回ID(insert into ... returning id)。

我一直在尝试caseif else语句的变体,但似乎无法使其正常工作。


阅读 210

收藏
2021-03-10

共1个答案

一尘不染

我建议在数据库端进行检查,然后将ID返回给nodejs。

例子:

CREATE OR REPLACE FUNCTION foo(p_param1 tableFoo.attr1%TYPE, p_param2 tableFoo.attr1%TYPE) RETURNS tableFoo.id%TYPE AS $$
  DECLARE
  v_id tableFoo.pk%TYPE;
  BEGIN
    SELECT id
    INTO v_id
    FROM tableFoo
    WHERE attr1 = p_param1
    AND attr2 = p_param2;

    IF v_id IS NULL THEN
      INSERT INTO tableFoo(id, attr1, attr2) VALUES (DEFAULT, p_param1, p_param2)
      RETURNING id INTO v_id;
    END IF;

    RETURN v_id:

  END;
$$ LANGUAGE plpgsql;

而不是在Node.js端(在此示例中,我使用的是node-postgres):

var pg = require('pg');
pg.connect('someConnectionString', function(connErr, client){

  //do some errorchecking here

  client.query('SELECT id FROM foo($1, $2);', ['foo', 'bar'], function(queryErr, result){

    //errorchecking

    var id = result.rows[0].id;

  };

});
2021-03-10