Как передать значения списка в запрос SQL Select? - PullRequest
0 голосов
/ 17 декабря 2018

SQL-запрос:

Select *
from table_name 
where ID in (123) 
  and date in (Select max(date) 
               from table_name 
               where ID in (123))

Я хочу передать указанные ниже значения списка по одному в приведенном выше SQL-запросе и собрать результаты для каждого идентификатора в списке. Пакет: cx_Oracle

Моя попытка:

import cx_oracle
List= {123, 234,345,....}
List1 = []
query = " Select * from table_name where ID in (%s) 
     and date in (Select max(date) from table_name where ID in (%s))"

for j in List:
    cursor1 = db_ora.cursor()
    tb = cursor1.execute(query, params= List )
    for i in tb:
        List1.append(i)

Заранее спасибо, дайте мне знать, если вам нужна дополнительная информация с моей стороны

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Если вы хотите сохранить его похожим на ваш исходный код, вы можете использовать форматирование строки

Python 2

import cx_oracle
List= [123, 234,345,....]
List1 = []
masterQuery = " Select * from table_name where ID in (%s) 
     and date in (Select max(date) from table_name where ID in (%s))"

for j in List:
    cursor1 = db_ora.cursor()
    newQuery = masterQuery % (j, j)
    tb = cursor1.execute(newQuery)
    for i in tb:
        List1.append(i)

Python 3

import cx_oracle
List= [123, 234,345,....]
List1 = []
masterQuery = " Select * from table_name where ID in {} 
     and date in (Select max(date) from table_name where ID in {})"

for j in List:
    cursor1 = db_ora.cursor()
    newQuery = masterQuery.format(j, j)
    tb = cursor1.execute(newQuery)
    for i in tb:
        List1.append(i)
0 голосов
/ 17 декабря 2018

Насколько я могу судить, Oracle не примет такой список в качестве допустимого параметра.Либо сохраните этот список значений в отдельной таблице и используйте его в качестве источника для вашего запроса, например

and t.date in (select max(t1.date) from table_name t1
               where t1.id in (select st.id from some_table st)
              )

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

and t.date in (select max(t1.date) from table_name t1
               where t1.id in (select regexp_substr(%s, '[^,]+', 1, level) 
                               from dual
                               connect by level <= regexp_count(%s, ',') + 1
                              )
              )

Кроме того, я бы предложил перед именами столбцов использовать псевдонимы таблиц, чтобы избежать возможной путаницы.

...