Я извлекаю записи из SQL Server из python:
REGION = 'HK'
.
.
where
R.rfq_create_date_time >= '""" + START_DATE + """'
and R.rfq_create_date_time <= '""" + END_DATE + """'
and R.latest_version = 'Y'
and R.sales_book in ('""" + sales_code_string + """')
and R.Trading_book in ('""" + Trading_Books + """')
) as innerTable
WHERE rfq_create_time not between '""" + START_TIME + """' and '""" + END_TIME + """'
order by rfq_create_time"""
print (strSql)
print("")
df_With_NaN = pd.read_sql(strSql, pyodbc.connect(connstr))
Я хочу, чтобы только and R.Trading_book in
состоянии, включенном в строку, передавались моему соединению, если REGION
является HK или SY. В случае TK я хочу, чтобы условие проигнорировало все вместе.
Является ли метод replace лучшим способом сделать это в python или есть альтернативный? Например:
REGION = "TK"
strsql = "select * from table where ccy = 'AAA' ######"
if REGION == "HK":
booklist = "'AAA','BBB','CCC'"
elif REGION == "SY":
booklist = "'CCC','DDD','FFF'"
if REGION == "TK":
strsql = strsql.replace("######", "")
else:
strsql = strsql.replace("######", " and book in (" + booklist + ")")
print (strsql)
Альтернативой, которая может быть немного более удобочитаемой, было бы
if REGION == "HK":
booklist = "'AAA','BBB','CCC'"
elif REGION == "SY":
booklist = "'CCC','DDD','FFF'"
else:
booklist = ""
booklist_clause = "AND book IN ({})".format(booklist) if booklist else ""
strsql = "SELECT * FROM table WHERE ccy = 'AAA' {}".format(booklist_clause)
или, если вы используете Python 3.6 или новее, вы можете сделать
booklist_clause = f"AND book IN ({booklist})" if booklist else ""
strsql = f"SELECT * FROM table WHERE ccy = 'AAA' {booklist_clause}"