对于一列情况,重复的问题及其答案显示在: Parameter substitution for a SQLite "IN" clause
我想将 oldTable
的 ColA
和 ColB
中的数据复制到 newTable
中。 oldTable
中的 ColA
和 ColB
的数据类型为 INTEGER
。
通过复制数据,我还想检查 ColA 或 ColB
是否是字符串的一部分(在本例中为 TextTemp
)。
我的问题是:ColA
和ColB
的数据类型为INTEGER
,而TextTemp
是TEXT
格式。不同数据类型无法比较。
因此问题是:如何将 ColA
和 ColB
中的数据从 INTEGER
转换为 TEXT
?
这是我的 Python 代码。应复制 ColA 或 ColB
中的 15、3、44 和 9。
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))
错误消息:TypeError:格式字符串参数不足
我很确定上面的代码非常接近最终的正确版本,但我只是不知道如何更改它。
PS:我无法使用for循环,所以请帮我解决上述方法中的问题。
最佳答案
最简单的方法是在 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 (?,?,?,?)
由于每个 ?
都绑定(bind)到参数列表中的不同参数,并且我们现在有 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)
关于python - 如何将数据类型从整数转换为文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42570875/