如何将数据类型从Integer转换为Text?

时间:2017-03-03 04:48:51

标签: python sqlite

对于一个列情况,带答案的重复问题显示在:Parameter substitution for a SQLite "IN" clause

我想将ColA的{​​{1}}和ColB数据复制到oldTablenewTable中的ColAColB的数据类型为oldTable

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

我的问题是:TextTempColA的数据类型为ColBINTEGER的格式为TextTemp。无法比较不同的数据类型。

因此问题:如何将TEXTColA中的数据从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循环,所以请帮我解决上述方法中的问题。

1 个答案:

答案 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)