Python — запуск SQL в цикле на основе значения столбца

#python #sql #loops

#python #sql #циклы

Вопрос:

Я пытаюсь создать SQL-запрос, который выполняется на основе определенных условий (если столбец заполнен, запустите запрос 1, другой запрос 2 и так далее), Как показано ниже:

 if len(col_a) > 0 and len(col_b) > 0: ## Both columns have value
    dwh_cursor.execute(f"""select * from table where col_a = '{col_a}' and col_b = '{col_b}'""")

elif len(col_a) > 0 and len(col_b) < 1: ## Only col_a has value
    dwh_cursor.execute(f"""select * from table where col_a = '{col_a}'""")

elif len(col_a) < 1 and len(col_b) > 0: ## Only col_b has value
    dwh_cursor.execute(f"""select * from table where col_b = '{col_b}'""")
  

Я пытаюсь создать что-то подобное приведенному выше, но количество полей в качестве переменных (таких полей, как col_a и col_b ) равно 6. Есть ли способ, которым я могу выполнить это в цикле на основе длины поля, вместо того, чтобы вручную указывать каждое условие явно, как я сделал выше.

Комментарии:

1. знаете ли вы строковые функции Python и форматирование строк? ie "and ".join(["col_a = '{col_a}'", "col_b = '{col_b}'"]) и ["{name} = {{{name}}}" for name in ["col_a", "col_b"]]

2. сначала вы должны сохранить столбцы в списке col[0] , col[1] или в dict col["a"] , col["b"] — а затем вы можете использовать циклы.

Ответ №1:

Вы должны сохранять значения в списке или в словаре, а затем вы можете использовать for -loop для фильтрации пустых элементов.

Позже вы можете использовать строковые функции и for -loop для преобразования в col = val и join() для соединения этих элементов с помощью word AND и т.д.

 where = {
    'col_a': '',   # empty so it will skip it
    'col_b': 'A',
    'col_c': '1',
}

where_filtered = {key:val for key, val in where.items() if val}

print('where filtered:', where_filtered)

where_parts = [f'{key} = {val}' for key, val in where_filtered.items()]

print('where parts:', where_parts)

where_query = ' and '.join(where_parts)

print('where query:', where_query)

query = 'SELECT * FROM table'
if where_query:
    query  = ' WHERE '   where_query
    
print('query:', query)
    
  

Результаты:

 where filtered: {'col_b': 'A', 'col_c': '1'}
where parts: ['col_b = A', 'col_c = 1']
where query: col_b = A and col_c = 1
query: SELECT * FROM table WHERE col_b = A and col_c = 1
  

Комментарии:

1. спасибо за вывод. Это помогло.. Есть один вопрос по этому поводу. Когда я запускаю SQL cursor.execute(query) , происходит сбой. Я полагаю, это потому, что для col_b в предложении where это ожидаемо col_b = 'A' .. Как я мог бы изменить это, чтобы передать его в правильном формате. Спасибо..

2. понял это. Спасибо за вашу помощь!!

3. f"{key} = '{val}'"

4. Кстати: я использовал word where в коде, потому что аналогичным образом вы можете использовать его также для order by , group by и т.д.