2017-03-03 38 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

相關問題