2017-03-03 154 views
1

一分的情况下,与回答重复的问题显示在:Parameter substitution for a SQLite "IN" clause如何将数据类型从整数转换为文本?

我想将数据从oldTableColAColB复制到newTableColAColBoldTable具有INTEGER的数据类型。

通过复制数据,我还想检查ColA or ColB是否是字符串的一部分(在本例中为TextTemp)。

我的问题是:ColAColBINTEGER的数据类型,以及TextTempTEXT格式。不能比较不同的数据类型。

这样的问题:我如何才能在ColAColB转换数据从INTEGERTEXT

这是我在Python中的代码。应该复制ColA or 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: not enough arguments for format string

我敢肯定,上面的代码是非常接近它的最终版本是否正确,但我只是不知道如何去改变它。

PS:我不能使用for循环,所以请帮我解决上述方法中的问题。

+1

执行'TextTemp =“15 3 44 9”.split()'并按照伪指针中的说明操作。除了形成参数化的查询字符串之外,只需将分割的'TextTemp'作为第二个参数传递给'cur.execute'即可(它将成为参数序列)。当谈到类型时,SQLite相当[宽松](https://www.sqlite.org/datatype3.html#comparison_example),所以你应该能够比较它们。 –

+0

重复适用,除非您需要使用'?'作为实际最终占位符 –

+0

@IljaEverilä感谢您的评论和帮助。我试过但没有发现重复的问题。我更新了我的问题,你可以看看吗? – doglas

回答

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) 
+0

非常好!非常感谢你的出色答案!有用!我甚至不会想到这些代码。灿烂!谢谢! – doglas

相关问题