Использование строки в кадре данных внутри оператора SQL IN - PullRequest
0 голосов
/ 13 июля 2020

У меня есть строка фрейма данных, которую я пытаюсь вывести в список или кортеж, которая будет go в операторе «IN» в запросе SQL. Это код, который у меня есть на данный момент.

check_query = f"SELECT DISTINCT SSN AS SS, EnteredDate, CONVERT(VARCHAR, D, 23) AS F_D FROM PD WHERE EnteredDate IS NOT NULL AND SSN IN {tuple(list(df_to_add_pc['SS']))}"
print(check_query)

В настоящее время я получаю следующие выходные данные:

Execution failed on sql 'SELECT DISTINCT SSN AS SS, EnteredDate, CONVERT(VARCHAR, D, 23) AS F_D FROM PD WHERE EnteredDate IS NOT NULL AND SSN IN (1, 12, 123, 1234, 12345)'

Вот список столбцов Dataframe:

col_list = ["SS", "LN", "FN", "DB", "G", "F_D", "SRC", "Q_FACTOR"]

Он использует их как целые числа, и они должны быть строками. Есть ли способ преобразовать их в строку и таким же образом вывести их в запрос?

Примечание. SSN внутри этого вопроса, очевидно, изменены по соображениям безопасности. Кроме того, тип переменной должен быть строковым, поскольку перед некоторыми из этих SSN есть идентификаторы.

Заранее спасибо!

1 Ответ

1 голос
/ 14 июля 2020

Вам необходимо самостоятельно построить весь оператор IN со строками SQL. Попробуйте следующее:

in_statement = ', '.join([f"'{i}'" for i in df_to_add_pc['SS']])
check_query = f"SELECT DISTINCT SSN AS SS, EnteredDate, CONVERT(VARCHAR, D, 23) AS F_D FROM PD WHERE EnteredDate IS NOT NULL AND SSN IN ({in_statement})"

Или, если вам нужен беспорядочный однострочник:

check_query = f"""SELECT DISTINCT SSN AS SS, EnteredDate, CONVERT(VARCHAR, D, 23) AS F_D FROM PD WHERE EnteredDate IS NOT NULL AND SSN IN ({', '.join(["'"+str(i)+"'" for i in df_to_add_pc['SS']])})"""

Обратите внимание, что это оставляет код открытым для потенциальных атак SQL инъекций. Для предотвращения этого следует использовать заполнители запросов. За подробностями обращайтесь к документации используемой библиотеки SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...