将列表元素添加到 WHERE 子句

Adding list elements to WHERE clause

我想在此 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 子句?

使用 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).*'

我希望 juris 是一个字符串列表?如果是这样,这可能会有所帮助:

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

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