2017-12-19 9 views
1

python-Django RAWクエリを使用してSQLクエリを実行しています。構文空のリストが渡されたときにSQLクエリ(選択)にエラーが発生しました

私は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)))))) 

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

これは、リスト内のNULL

if not dnc_company_name: 
    dnc_company_name = [None] 

を提供することによって解決され、最後に、私の質問に、私はtuplednc_company_nameを変換しています。

と私の問題を解決しました。

-1

INの右側部分は、正確に1列を返すサブクエリにする必要があります https://www.postgresql.org/docs/current/static/functions-subquery.html#FUNCTIONS-SUBQUERY-IN

を私はこのエラーをスロー

SELECT * 
FROM table_with_data 
WHERE toto IN (SELECT * FROM empty); 

を試してみました:

ERROR: subquery has too few columns

私はあなたが必要がありますねあなたの列が厳密にNではない場合は、IN(NULL)と入力してくださいULL。

+0

私の場合、別のファイルのJSONデータを '' IN() ''関数で使用していますが、別のテーブルのサブクエリではありません –

関連する問題