确保所有值都存在于具有一个查询的表中

时间:2017-02-27 12:02:19

标签: sql postgresql psycopg2 postgresql-9.6

所以我有一个简单的城镇名单,包括芬兰语和瑞典语名称:

CREATE TABLE town (id SERIAL PRIMARY KEY, name_fi TEXT, name_sv TEXT);

我需要检查一个特定的城镇是否存在。这很容易:

cursor.execute(
    "SELECT EXISTS ( SELECT 1 FROM town WHERE name_fi=%s OR name_sv=%s )",
    (town, town)
)
result = cursor.fetchone()  # True/False

但现在我需要为多个城镇做这件事,以确保他们所有存在:

for town in towns:
    # Code for one town from above
    if result is False:
        return False
return True

有没有办法用一个查询而不是使用Python for循环来执行此操作?

1 个答案:

答案 0 :(得分:0)

将城镇作为清单传递:

cities = ['Paris', 'London']
template = ','.join(['%s'] * len(cities))

根据需要加入并汇总:

query = '''
    select bool_and(name_fi is not null or name_sv is not null)
    from
        town
        right join
        (values {}) s (name) on name in (name_fi, name_sv)
'''.format(template)

print (cursor.mogrify(query, [tuple((city,)) for city in cities]).decode('utf8'))
cursor.execute(query, [tuple((city,)) for city in cities])

结果为TrueFalse

print cursor.fetchone()[0]

输出:

select bool_and(name_fi is not null or name_sv is not null)
from
    town
    right join
    (values ('Paris'),('London')) s (name) on name in (name_fi, name_sv)

True

对于Python部分check this answer