2017-06-01 96 views
1

我正在編寫一個python腳本以將信息從大量文本文件中提取到數據庫中。爲了簡單起見,假設列是id(主鍵,存儲爲text的一串數字),name(存儲爲text,不唯一)以及一堆包含其他數據的其他列。在sqlite數據庫中更新字符擴展的字段,其中最不重要的數字/字符匹配

腳本都在一個點但是效果很好,在源文件中的id領域從< = 6個字符的7個字符改變,與額外的數字添加到現有記錄ID的開始 - 那麼12345有可能成爲2(或3312345等)。似乎沒有辦法一致確定增加的數字是什麼,但前面的id總是仍然作爲最不重要的n數字(其中n =舊的id的長度)。

我想要做的就是創建一個SQLite查詢到在進口,其中用於更新id到新格式的id換個點上運行,其中一)name領域是一樣的現有行新記錄的最低有效位數與舊ID完全匹配。我正在努力編寫一個這樣的查詢,但是 - 有什麼想法?

編輯:按照要求,例如數據:

初始表:

+--------+-----------------+-------+ 
| id |  name  | other | 
+--------+-----------------+-------+ 
| 277908 | Anderson, Jason | foo | 
| 10360 | Anderson, Jean | bar | 
| 10371 | Anderson, John | baz | 
| 57892 | Anderson, John | qwe | 
+--------+-----------------+-------+ 

那麼,如果我們遇到的記錄被更新:

+---------+-----------------+-----+ 
| 1277908 | Anderson, Jason | asd | 
+---------+-----------------+-----+ 

的ID被更新並且桌子變成:

+--------+-----------------+-------+ 
| id |  name  | other | 
+--------+-----------------+-------+ 
|1277908 | Anderson, Jason | foo | 
| 10360 | Anderson, Jean | bar | 
| 10371 | Anderson, John | baz | 
| 57892 | Anderson, John | qwe | 
+--------+-----------------+-------+ 

但是,如果我們再遇到記錄:

+---------+-----------------+-----+ 
| 2010360 | Anderson, Jean2 | zxc | 
+---------+-----------------+-----+ 

那麼該表沒有被修改的名稱不匹配一個記錄中,如果我們遇到的記錄:

+---------+----------------+-----+ 
| 2010371 | Anderson, John | poi | 
+---------+----------------+-----+ 

那麼只有具有匹配至少顯著數字ID被更新,並表變爲:

+--------+-----------------+-------+ 
| id |  name  | other | 
+--------+-----------------+-------+ 
|1277908 | Anderson, Jason | foo | 
| 10360 | Anderson, Jean | bar | 
|2010371 | Anderson, John | baz | 
| 57892 | Anderson, John | qwe | 
+--------+-----------------+-------+ 

需要注意的是,我們在這裏只有更新ID字段 - 這是故意的,因爲這將是一次運行一次的條件,它將更新發生id更改的數據中的記錄。其他數據將被更新或在該零件運行後添加記錄。

+0

請提供一些示例數據和您期望的結果。 (有關如何添加一些內容,請參見[如何 格式堆棧溢出 post?](https://meta.stackexchange.com/q/96125)中的SQL表格。) –

+0

@CL。添加示例。 – davidov7

+0

什麼是* n *? 5或6? –

回答

0

那表情就轉換爲SQL:

UPDATE MyTable 
SET id = :Newid 
WHERE :NewId != id 
    AND substr(:NewId, -length(id)) = id 
    AND name = :NewName 

(這裏假定id值是字符串。)

+0

這似乎已經做了竅門 - 感謝您的幫助! – davidov7