2015-08-30 2 views
0

Я хочу добавить еще одно условие в этом WHERE пункте:Добавление элементов списка в ИНЕКЕ

stmt = 'SELECT account_id FROM asmithe.data_hash WHERE percent < {};'.format(threshold)

У меня есть переменная juris которая является список. Значение account_id и juris связано с тем, что при создании account_id оно содержит подстроку juris.

Я хочу добавить к запросу условие, что оно должно соответствовать любому из элементов juris. Обычно я бы просто добавил ...AND account_id LIKE '{}%'".format(juris), но это не работает, потому что juris - это список.

Как добавить все элементы списка в пункт WHERE?

ответ

0

Использование Regex с оператором ~:

juris = ['2','7','8','3'] 

'select * from tbl where id ~ \'^({})\''.format('|'.join(juris)) 

что приводит к этому запросу:

select * from tbl where id ~ '^(2|7|8|3)' 

Это приводит строки, которые их idначать с любого из 2,7,8 или 3 Здесь есть fiddle.

Если вы хотите id начать с 2783 использования:

select * from tbl where id ~ '^2783' 

и если idсодержит любой из 2,7,8 или 3

select * from t where id ~ '.*(2|7|8|3).*' 
+0

Как вы совмещаете это с регулярным выражением? – Celeritas

+0

Нет, но это была бы любая строка, где id * начал * с 2,7,8 или 3. Это то, что я имею в виду, используя LIKE и регулярные выражения. – Celeritas

+0

Нет, вам нужны записи, что их 'account_id' находится в' juris', верно? –

0

Я надеюсь ипз список строк? Если да, то это может помочь:

myquery = ("SELECT accountid FROM asmithe.data_hash " 
      "WHERE percent in (%s)" % ",".join(map(str,juris))) 

Смотрите эти ссылки:

  1. python list in sql query as parameter

  2. How to select item matching Only IN List in sql server

  3. String formatting operations

+0

Ahem, SQL injection? Пожалуйста, никогда, никогда не приводите примерный код, подобный этому, это ужасно неуверенно. –

0

Stop using string formatting with SQL. Right now. Понимаю?

OK сейчас. В SQL есть конструкция, ANY, которая позволяет вам взять оператор и применить его к массиву. psycopg2 поддерживает передачу списка Python как SQL ARRAY[]. Так что в этом случае вы можете просто

curs.execute('SELECT account_id FROM asmithe.data_hash WHERE percent LIKE ANY (%s)', (thelist,)) 

Здесь следует отметить, что %s является psycopg2 запросами параметров заполнителя. Это не спецификатор формата. Второй аргумент - это кортеж, параметры запроса. Первым (и единственным) параметром является список.

Существует также ALL, который работает как ANY, но имеет значение true, только если все совпадения верны, а не только если одно или несколько истинно.

Смежные вопросы