传递空列表时SQL语句中的语法错误(选择)

问题描述 投票:1回答:2

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

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

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

在这里,我从json /函数获取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))))))

查询:

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应该处理空元组或非空元组。

python sql django postgresql
2个回答
0
投票

这可以通过在列表中提供NULL值来解决

if not dnc_company_name:
    dnc_company_name = [None]

最后,在我的问题中,我正在将dnc_company_name转换为tuple

它解决了我的问题。


-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)。

© www.soinside.com 2019 - 2024. All rights reserved.