我想重复此命令多次,因为字段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
的所有大小写组合(例如sometext
,sometext
,SOMEtext
。 ..)参见此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
答案 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()