我正在使用python-Django RAW Query运行SQL查询.. !!
我使用 IN()函数在查询中传递我的元组。
我的代码看起来像这样......
这里我从json / function
获取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))))))
QUERY:
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应该处理空元组或非空元组。
答案 0 :(得分:0)
通过在列表
中提供NULL
值来解决此问题
if not dnc_company_name:
dnc_company_name = [None]
最后,在我的问题中,我正在将dnc_company_name
转换为tuple
。
它解决了我的问题。
答案 1 :(得分:-2)
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)。