传递空列表时SQL查询(select)中的语法错误

时间:2017-12-19 09:53:45

标签: python sql django postgresql

我正在使用python-Django RAW Query运行SQL查询.. !!

我使用 IN()函数在查询中传递我的元组。

我的代码看起来像这样......

这里我从json / function

获取dnc_domainsdnc_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_namesdnc_domain_name 为空[] 时,我的查询会抛出错误,否则如果其中任何一个至少有1个元素然后它运作正常。

SQL错误:

syntax error at or near ")"
LINE 5:                                 WHERE id IN ()
                                                     ^

所以,帮我解决这个错误。 SQL应该处理空元组或非空元组。

2 个答案:

答案 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)