一尘不染

插入表(如果不存在)并在两种情况下都返回ID

sql

我试图在 POSTGRES中 编写一个复杂的查询,这个问题是该子查询。

这是我的表(id是主键和自动递增):

id    appid    name
1      2        abc
2      2        cde

在此表中,我想获取id为“ xyz”且appid = 2的id,如果不存在,则插入并返回ID。

我知道有几个类似的问题,有些问的有些相同,我已经尝试过了,但似乎没有用。

这是我试图起诉的,但未能按预期进行:

INSERT INTO table_name (appid, name) SELECT 2, 'xyz' WHERE NOT EXISTS (SELECT id from table_name WHERE appid=2 AND name='xyz') returning id

当添加新元素并返回新添加元素的ID时,此方法效果很好,但当行已存在时不返回任何内容。

对于前

INSERT INTO table_name (appid, name) SELECT 2, 'abc' WHERE NOT EXISTS (SELECT id from table_name WHERE appid=2 AND name='abc') returning id

这不会返回任何东西。


阅读 219

收藏
2021-03-08

共1个答案

一尘不染

你可以做:

with id as (
      select id
      from table_name
      where appid = 2 and name = 'xyz'
     ),
     i as (
      insert table_name (appid, name)
          select 2, 'xyz' 
          where not exists (select 1 from id)
          returning id
     )
select id
from id
union all
select id
from i;
2021-03-08