Опустите одно из многих, где условия, если константа является конкретным значением - PullRequest
0 голосов
/ 12 октября 2018

Я извлекаю записи из 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 я хочу, чтобы условие игнорировалось все вместе.

Является ли метод замены лучшим способом сделать это в 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)

1 Ответ

0 голосов
/ 12 октября 2018

Альтернативой, которая может быть немного более удобочитаемой, будет

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}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...