从列表中选择不在表中的值?

时间:2016-01-05 23:03:04

标签: postgresql psycopg2

我想做以下事情;什么是最简单的方法?

SELECT id FROM (1,2,3) WHERE ID NOT IN (SELECT id FROM table)

这个想法不是通过首先将表ID加载到脚本中来增加我的python脚本的内存使用量。 我能想到的唯一方法是使用WITH查询构建一个临时表,这有点冗长。

2 个答案:

答案 0 :(得分:0)

select id from (values (1),(2),(3)) as s(id)
except
select id from table

用Psycopg做到这一点:

id_list = ['1','2','3']
q = """
    select array_agg(id)
    from (
        select id from (values {}) s(id)
        except
        select id from table
    ) t;
""".format(','.join(['%s'] * len(id_list)))

print cur.mogrify(q, [(id,) for id in id_list])
# cur.execute(q, [(id,) for id in id_list])

输出:

select array_agg(id)
from (
    select id from (values ('1'),('2'),('3')) s(id)
    except
    select id from table
) t;

答案 1 :(得分:0)

提供的答案就像魅力一样,但是我无法使用内置字符串格式的psycopg2,因为每个值都需要在提供的答案中使用括号,除了构建查询字符串外,还不确定是否有办法解决问题手动

select array_agg(ids)
from (
  select unnest(ARRAY['1', '2'])
  except
  select unnest(array_agg(sku::text)) from table
) t (ids);

以下是另一种方法,因为psycopg2有python list> postgres数组转换器

{{1}}