在true或x次数(等于while / for循环)时重复命令

时间:2019-05-28 11:44:43

标签: sqlite

我想重复此命令多次,因为字段sometext中仍然有note(表itemNotes中的几行可以有一个或多个{{1} }在sometext字段中:

note

一个原始代码就是:

UPDATE itemNotes  
SET 
  note = SUBSTR(note, 0, INSTR(LOWER(note), 'sometext')) || 'abc' || SUBSTR(note, INSTR(LOWER(note), 'sometext')+sometext_len)
WHERE 
  INSTR(LOWER(note), 'sometext') >= 0;

但是显然While (SELECT * FROM itemNotes WHERE note like "%sometext%") >1 UPDATE itemNotes SET note = SUBSTR(note, 0, INSTR(LOWER(note), 'sometext')) || 'abc' || SUBSTR(note, INSTR(LOWER(note), 'sometext')+sometext_len) WHERE INSTR(LOWER(note), 'sometext') >= 0; END 不支持While循环或for循环。可以使用this之类的东西来模拟它们,但是我很难将我想要的东西与此查询集成在一起:

Sqlite3

有什么想法吗?

PS:我不使用 WITH b(x,y) AS ( SELECT 1,2 UNION ALL SELECT x+ 1, y + 1 FROM b WHERE x < 20 ) SELECT * FROM b; ,因为我想替换replace的所有大小写组合(例如sometextsometextSOMEtext。 ..)参见此question


当前输入和所需输出:

对于一行,注释字段可能看起来像(表SOmeText中的许多行可能看起来像这样):

itemNotes

查询应输出:

There is SOmetext and also somETExt and more SOMETEXT and even more sometext

我正在zotero.sqlite上执行此操作,该文件由this文件创建(第85行)。该表是通过该查询创建的

There is abc and also abc and more abc and even more abc

2 个答案:

答案 0 :(得分:1)

您只需在查询中提供答案即可

UPDATE itemNotes  
SET 
  note = SUBSTR(note, 0, INSTR(LOWER(note), 'sometext')) || 'abc' || SUBSTR(note, INSTR(LOWER(note), 'sometext')+sometext_len)
WHERE 
  note LIKE "%sometext%";

它将更新sometext字段中包含note的所有行

更新

如果要更新在不同情况下多次出现的字段并保留其余文本,则imo最简单的解决方案是使用regex,为此,您需要extension

UPDATE itemNotes  
SET 
  note = regex_replace('\bsometext\b',note,'abc')
WHERE 
  note LIKE "%sometext%";

答案 1 :(得分:1)

正如Stephan在他的最后一条评论中所建议的那样,我使用python来做到这一点。

这是我的代码:

import sqlite3
import re
keyword = "sometext"
replacement = "abc"

db = sqlite3.connect(path_to_sqlite)
cursor = db.cursor()

cursor.execute(f'SELECT * FROM itemNotes  WHERE note like "%{keyword}%"')

for row in cursor.fetchall():
    row_regex = re.compile(re.escape(keyword), re.IGNORECASE)
    row_regex_replaced = row_regex.sub(replacement, row[2])

    rowID = row[0]
    sql = "REPLACE INTO itemNotes (itemID,note) VALUES (?,?)"
    data = (rowID, row_regex_replaced)
    cursor.execute(sql, data)
    db.commit()