所以我有一个简单的城镇名单,包括芬兰语和瑞典语名称:
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
循环来执行此操作?
答案 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])
结果为True
或False
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