Sqlite:多个更新(查找和替换)不区分大小写
Sqlite: multiple update (find and replace) case insensitive
我使用 DB Browser for SQLite 来可视化和更新 sqlite 文件。
我可以执行 运行 区分大小写的查询来更新一些文本,如下所示:
UPDATE itemNotes SET note = REPLACE(note , 'sometext', 'abc');
但我想匹配替换 sometext
的所有大小写组合(例如 sometext
、SOMEtext
、SOmeText
...)
我试过这样做:
UPDATE itemNotes SET note = REPLACE(LOWER(note), 'sometext', 'abc');
但这会将字段 note
的全部内容转换为小写,这不是我想要的。
我也试过这些查询但没有成功:
UPDATE itemNotes SET note = REPLACE(note, BINARY 'sometext', 'abc')
UPDATE itemNotes SET note = REPLACE(note, COLLATE Latin1_General_CS_AS'sometext', 'abc')
我正在 zotero.sqlite 上执行此操作,它是由 file 创建的(第 85 行)。
table 是由此查询创建的
CREATE TABLE itemNotes (
itemID INTEGER PRIMARY KEY,
parentItemID INT,
note TEXT,
title TEXT,
FOREIGN KEY (itemID) REFERENCES items(itemID) ON DELETE CASCADE,
FOREIGN KEY (parentItemID) REFERENCES items(itemID) ON DELETE CASCADE
);
您需要在LOWER(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;
!注意:一次只能替换一个。
Nosyara 的回答效果很好,但它一次只能删除 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%";
但是当我在字段 note
中多次出现 sometext
时,只有第一个被删除。根据对这个问题的评论,我最终使用 python 来替换 sqlite,请参阅
我使用 DB Browser for SQLite 来可视化和更新 sqlite 文件。
我可以执行 运行 区分大小写的查询来更新一些文本,如下所示:
UPDATE itemNotes SET note = REPLACE(note , 'sometext', 'abc');
但我想匹配替换 sometext
的所有大小写组合(例如 sometext
、SOMEtext
、SOmeText
...)
我试过这样做:
UPDATE itemNotes SET note = REPLACE(LOWER(note), 'sometext', 'abc');
但这会将字段 note
的全部内容转换为小写,这不是我想要的。
我也试过这些查询但没有成功:
UPDATE itemNotes SET note = REPLACE(note, BINARY 'sometext', 'abc')
UPDATE itemNotes SET note = REPLACE(note, COLLATE Latin1_General_CS_AS'sometext', 'abc')
我正在 zotero.sqlite 上执行此操作,它是由 file 创建的(第 85 行)。 table 是由此查询创建的
CREATE TABLE itemNotes (
itemID INTEGER PRIMARY KEY,
parentItemID INT,
note TEXT,
title TEXT,
FOREIGN KEY (itemID) REFERENCES items(itemID) ON DELETE CASCADE,
FOREIGN KEY (parentItemID) REFERENCES items(itemID) ON DELETE CASCADE
);
您需要在LOWER(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;
!注意:一次只能替换一个。
Nosyara 的回答效果很好,但它一次只能删除 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%";
但是当我在字段 note
中多次出现 sometext
时,只有第一个被删除。根据对这个问题的评论,我最终使用 python 来替换 sqlite,请参阅