SQLite:多个更新(查找和替换)不区分大小写

时间:2019-05-21 16:06:56

标签: sql sqlite sql-update collate

我使用用于SQLite的数据库浏览器来可视化和更新sqlite文件。

我能够执行区分大小写的查询来更新某些文本,如下所示:

UPDATE itemNotes  SET note = REPLACE(note ,  'sometext', 'abc');

但是我想匹配替换sometext的所有大小写组合(例如sometextSOMEtextSOmeText ...)

我试图这样做:

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行)。 该表是通过该查询创建的

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
);

2 个答案:

答案 0 :(得分:1)

您需要在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;

!注意:一次只能更换一次。

答案 1 :(得分:0)

Nosyara答案很好用,但一次只能删除1个实例。

我也在here中尝试过此操作:

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时,则仅删除第一个。基于对此问题的评论,我最终使用python替换了sqlite,请参见here