对于一个列情况,带答案的重复问题显示在:Parameter substitution for a SQLite "IN" clause
我想将ColA
的{{1}}和ColB
数据复制到oldTable
。 newTable
中的ColA
和ColB
的数据类型为oldTable
。
通过复制数据,我还想检查INTEGER
是否是字符串的一部分(在本例中为ColA or ColB
)。
我的问题是:TextTemp
和ColA
的数据类型为ColB
,INTEGER
的格式为TextTemp
。无法比较不同的数据类型。
因此问题:如何将TEXT
和ColA
中的数据从ColB
转换为INTEGER
?
这是我在Python中的代码。应复制TEXT
中的15,3,44和9。
ColA or ColB
错误消息:TextTemp = "15 3 44 9" #String format, but all numbers, with empty spaces
TextTemp = "15 3 44 9".split() #Convert TextTemp into TEXT format
cur.execute('''CREATE TABLE newTable AS
SELECT * FROM oldTable
WHERE ColA IN (%s)
OR ColB IN (%s)''' %
(','.join('?'*len(TextTemp)), TextTemp)
(','.join('?'*len(TextTemp)), TextTemp))
我很确定上面的代码非常接近其最终正确的版本,但我只是不知道如何更改它。
PS:我不能使用for循环,所以请帮我解决上述方法中的问题。
答案 0 :(得分:2)
最简单的方法是在cur.execute
之外为查询创建占位符。
您的in
个查询都需要 n 逗号分隔的问号。
>>> to_find = "15 3 44 9" # String format, but all numbers, with empty spaces
>>> to_find = to_find.split() # Convert TextTemp into TEXT format
>>> to_find
['15', '3', '44', '9']
>>> placeholders = ','.join('?' * len(to_find))
>>> placeholders
'?,?,?,?'
然后我们填写查询。我将使用.format
而不是旧式格式,因为使用新式格式更容易多次替换相同的值:
>>> query = '''CREATE TABLE newTable AS
SELECT * FROM oldTable
WHERE ColA IN ({0})
OR ColB IN ({0})'''.format(placeholders)
>>> print(query)
CREATE TABLE newTable AS
SELECT * FROM oldTable
WHERE ColA IN (?,?,?,?)
OR ColB IN (?,?,?,?)
由于每个?
都绑定到参数列表中的不同参数,我们现在有2 * n个占位符,我们也需要复制替换值,因此tofind * 2
:
>>> to_find * 2
['15', '3', '44', '9', '15', '3', '44', '9']
>>> cur.execute(query, to_find * 2)
这里是最终紧凑形式的代码
to_find = to_find.split()
placeholders = ','.join('?' * len(to_find))
query = '''CREATE TABLE newTable AS
SELECT * FROM oldTable
WHERE ColA IN ({0})
OR ColB IN ({0})'''.format(placeholders)
cur.execute(query, to_find * 2)