Sqlite: множественное обновление (поиск и замена) без учета регистра - PullRequest
2 голосов
/ 21 мая 2019

Я использую DB Browser для 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, который создается этим файлом (строка 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 ]

1 голос
/ 21 мая 2019

Вам нужно искать подстроку в 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;

! Примечание. Одновременно будет работать только одна замена.

0 голосов
/ 28 мая 2019

Носяра ответ отлично работает, но удаляет только 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, тогда удаляется только первый вкл. Основываясь на комментариях к этому вопросу, я использовал python для замены sqlite, см. здесь

...