将列表元素添加到WHERE子句

时间:2015-08-30 20:21:59

标签: python postgresql psycopg2

我想为此WHERE子句添加另一个条件:

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

我有变量juris这是一个列表。 account_idjuris的值相关,因为创建account_id时,它包含juris的子字符串。

我想在查询中添加它需要与juris个元素中的任何一个匹配的条件。通常我只会添加...AND account_id LIKE '{}%'".format(juris),但这不起作用,因为juris是一个列表。

如何将列表的所有元素添加到WHERE子句?

3 个答案:

答案 0 :(得分: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

如果您希望id2783开头,请使用:

select * from tbl where id ~ '^2783'

如果id 包含 2,7,8或3

中的任何一个

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

答案 1 :(得分: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

答案 2 :(得分:0)

Stop using string formatting with SQL. Right now。理解?

现在好了。 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,但只有当所有匹配都为真时才会为真,而不仅仅是一个或多个匹配为真。