我正在使用python-Django RAW Query运行SQL Query .. !!
我正在使用IN()函数在查询中传递我的元组。
我的代码看起来像这样......
在这里,我从json /函数获取dnc_domains
和dnc_company
的列表
dnc_domain_names = list(map(lambda x: get_domain_name(x), dnc_websites))
dnc_company_names = list(map(lambda l: l.lower(), list(filter(None, list(map(lambda x: x['company_name'], dnc_info))))))
查询:
select_query = """
select c.id
from (
select id, lower(company_name) as c_name,substring(website from '(?:.*://)?(?:www\.)?([^/]*)') as website_domain,
from contacts
where campaign_id = %s
) c
where
c.c_name IN %s
OR c.website_domain IN %s
"""
执行查询:
with connection.cursor() as cursor:
cursor.execute(select_query, (campaign.id,tuple(dnc_company_names),tuple(dnc_domain_names))
matching_contact_ids = cursor.fetchall()
但是,有一种情况,当任何dnc_company_names
或dnc_domain_name
为空[]然后我的查询抛出一个错误,否则,如果其中任何一个至少有1个元素,那么它工作正常。
SQL错误:
syntax error at or near ")"
LINE 5: WHERE id IN ()
^
所以,帮我解决这个错误。 SQL应该处理空元组或非空元组。
这可以通过在列表中提供NULL
值来解决
if not dnc_company_name:
dnc_company_name = [None]
最后,在我的问题中,我正在将dnc_company_name
转换为tuple
。
它解决了我的问题。
IN的右边部分必须是一个子查询,只返回一列:https://www.postgresql.org/docs/current/static/functions-subquery.html#FUNCTIONS-SUBQUERY-IN
我试过了
SELECT *
FROM table_with_data
WHERE toto IN (SELECT * FROM empty);
这引发了这个错误:
错误:子查询列太少
我猜你应该在你的列严格为非NULL的情况下提供IN(NULL)。