简体   繁体   English

Python / SQL-WHERE子句不适用于所有行

[英]Python/SQL - WHERE clause not applying to all Rows

I am having a problem with the following code in a Python program I built. 我在构建的Python程序中的以下代码有问题。 The program pulls data from a database and puts it into an Excel spreadsheet based on a list of reference numbers 'GrantRefNumber' that they input. 该程序从数据库中提取数据,然后根据它们输入的参考编号'GrantRefNumber'的列表将其放入Excel电子表格中。

It works, but for some reason only the FIRST reference number has the 'a.reporting_period_id like 'none-' applied to it, the rest do not. 它可以工作,但是由于某些原因,仅FIRST参考编号应用了'a.reporting_period_id like 'none-' ,其余部分则没有。

I am using a variable substitution in the SQL code to put the list of reference numbers into the string. 我在SQL代码中使用变量替换将参考数字列表放入字符串中。

Any help would be much appreciated! 任何帮助将非常感激!

SQL: SQL:

"SELECT a.fa_reference as [GrantRefNumber], 
a.fa_name as [Award Title], 
a.location as [RO], 
ISNULL(cat.grant_department_name, '') as [Department], 
a.funding_start_date as [Start Date], 
a.funding_end_date as [End Date], 
a.[pi]    as [PI ID],
a.pi_initials  as [PI Name], 
a.pi_surname as [PI Surname],  
r1_2 as [Type], 

DATEADD(s, cast(last_submitted_date as int), '1970-01-01 00:00:00') as [Submitted Date]  

from keywordagreements a inner join entries_publications p on a.id =  
p.agreement_id left outer join mrc_categories cat  on a.origid = cat.id and cat.centre not in ('2') 

where a.[pi] NOT LIKE 'S%' and response_code not like 'Test' and Closed is null  
and a.reporting_period_id like 'none-'
and a.funding_organisation not like '%UKSA%' and {}' 

Order by [RO], [PI ID], [GrantRefNumber]".format(finalList)

finalList (variable substitution): finalList(变量替换):

The finalList is a list of Reference Numbers that I get from the user in Python called 'items' finalList是我在Python中从用户那里获得的参考编号列表,称为“项目”

items = dfCall['GrantRefNumber'].values.tolist()
refList = " OR ".join(["a.fa_reference LIKE '%s'" % num for num in items])
finalList = refList[:-1]

I am using PYODBC to extract the data. 我正在使用PYODBC提取数据。

The SQL in my code looks like this (I removed the quote marks (and some of the columns) in the previous code to make it easier to read): 我代码中的SQL看起来像这样(我在上一个代码中删除了引号(和某些列),以使其更易于阅读):

stringQ = "SELECT a.fa_reference as [GrantRefNumber], a.fa_name as [Award Title]," \
          " a.location  as [RO], ISNULL(cat.grant_department_name, '') as [Department]," \
          " a.funding_start_date as [Start Date], a.funding_end_date        as [End Date]," \
          " a.[pi]  as [PI ID], a.pi_initials   as [PI Name]," \
          " a.pi_surname as [PI Surname], " \
          " r1_2 as [Type], ISNULL(r1_2_1, '')  as [PubMed ID]," \
          " r1_2_2  as [Author], r1_2_3 as [Publication], ISNULL(r1_2_4, '') as [Journal]," \
          " ISNULL(r1_2_8, '') as [Month], ISNULL(r1_2_9, '') as [Year], ISNULL(r1_2_4_1, '') as [Conference]," \
          " ISNULL(r1_2_36, '') as [PubMed Central ID], ISNULL (r1_2_19, '') as [DOI]," \
          " case when nullif(r1_2_1,'') is not null then 'http://europepmc.org/abstract/MED/' + r1_2_1 else case when" \
          " nullif(r1_4,'') is not null then r1_4 else case when nullif(r1_2_19,'') is not null then" \
          " 'http://dx.doi.org/' + r1_2_19 else isnull(r1_2_1,'') end  end end as [URL], ISNULL(r1_2_21, '') " \
          "as [ISBN]," \
          " ISNULL(r1_2_30, '') as [ISBN (Electronic)], " \
          " ISNULL(r1_2_25, '') as [Chapter Number], " \
          "ISNULL(r1_2_26, '')" \
          " as [Chapter Title], ISNULL(r1_2_27, '') as [Chapter Author]," \
          " ISNULL(r1_2_29, '') as [ISSN (Print)], ISNULL(r1_2_32, '')  as [ISSN (Digital)], " \
          "ISNULL(r1_2_31, '')  as [Web of Science ID], ISNULL(r1_2_34, '') as [Scopus ID], " \
          "ISNULL(r1_2_35, '')  as [arXiv DepositID]," \
          " ISNULL(r1_2_38, '') as [Bibcode], ISNULL(r1_2_39, '') as [Ethos], ISNULL(r1_2_43, '')   as [NASA-ADS ID]," \
          " ISNULL(r1_2_46, '') as [Inspire], ISNULL(r1_2_40, '') as [PMC Manuscript ID], ISNULL(r1_2_45, '')" \
          " as [ORCID Work Putcode]," \
          " ISNULL(r1_2_61, '') as [OpenAire Access License], ISNULL(r1_2_52, '') " \
          "as [In EPMC?], ISNULL(r1_2_53, '') as [In PMC?]," \
          " ISNULL(r1_2_51, '') as [EPMC Open Access], " \
          " DATEADD(s, cast(last_submitted_date as int), '1970-01-01 00:00:00') as [Submitted Date] " \
          "from keywordagreements a inner join entries_publications p on a.id = " \
          "p.agreement_id left outer join mrc_categories cat " \
          "on a.origid = cat.id and cat.centre not in ('2') where a.[pi] NOT LIKE 'S%' and " \
          "response_code not like 'Test' and Closed is null " \
          "and a.reporting_period_id like 'none-' " \
          "and a.funding_organisation not like '%UKSA%' and {}' " \
          "Order by [RO], [PI ID], [GrantRefNumber]".format(finalList)

I'm not seeing where your format command substitutes. 我看不到您的format命令替代的位置。 Here are a few examples of the format command: 以下是format命令的一些示例:

'This is a {} string.'.format('formatted')
'This is a {0} {1}.'.format('formatted', 'string')
'This is a {replace_me} {replace_me_2}.'.format(replace_me='formatted', replace_me_2='string')

Outputs This is a formatted string. 输出This is a formatted string.

You'll need to modify you SQL to insert finalList into the SQL. 您需要修改SQL才能将finalList插入SQL。 Since we can't see your whole code, it also appear like you might want to use triple-quote formatting for multi-line support: 由于看不到您的完整代码,因此看起来您可能想要使用三引号格式来支持多行:

sql = """
    SELECT * FROM table
    WHERE blah = '{string_to_compare}'
""".format(string_to_compare='blah')

Be very careful, you're open to SQL injection when using string substitution in any SQL query. 请非常小心,在任何SQL查询中使用字符串替换时,您都可以使用SQL注入。 Good luck! 祝好运!

Ok, I think I have fixed it. 好的,我想我已经解决了。 I put the {}' in brackets ie ({}') as it was treating the other reference numbers as a separate statement because of the OR command. 我将{}'放在方括号中,即({}') ,因为OR命令将其他参考数字视为单独的语句。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM