【发布时间】:2019-05-28 11:44:42
【问题描述】:
只要note 字段中仍有sometext,我想重复此命令的次数(表itemNotes 中的几行可能在sometext 字段sometext 中有一个或多个sometext) :
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
但显然Sqlite3 不支持 While 循环或 for 循环。它们可以用this 之类的东西来模拟,但我很难将我想要的东西与这个查询结合起来:
WITH b(x,y) AS
(
SELECT 1,2
UNION ALL
SELECT x+ 1, y + 1
FROM b
WHERE x < 20
) SELECT * FROM b;
知道怎么做吗?
PS:我不使用replace,因为我想替换sometext的所有大小写组合(例如sometext、SOMEtext、SOmeText...)参见question
当前输入和期望输出:
对于单行,注释字段可能看起来像(表中的许多行itemNotes可能看起来像这样):
There is SOmetext and also somETExt and more SOMETEXT and even more sometext
查询应该输出:
There is abc and also abc and more abc and even more abc
我在由this 文件(第 85 行)创建的 zotero.sqlite 上执行此操作。该表是由该查询创建的
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
);
【问题讨论】:
-
为什么不用内置的 REPLACE 功能呢?
-
对不起我没有提到这个:因为我想匹配
sometext的所有大小写组合@ cf stackoverflow.com/a/56243026/3154274 -
@CaiusJard,我试过这个
UPDATE itemNotes SET note = REPLACE(note , 'sometext', 'abc') COLLATE NOCASE;,但这个查询只替换了sometext的小写。
标签: sqlite