SQLite - заменить часть строки


104

Можно ли использовать SQLв SQLiteтаблице для замены части строки?

Например, у меня есть таблица, в одном из полей которой указан путь к файлу. Можно ли заменить части строки так, чтобы, например,

c:\afolder\afilename.bmp

становится

c:\anewfolder\afilename.bmp

?

Ответы:


207

Вы можете использовать встроенную replace()функцию для замены строки в запросе.

Другие функции обработки строк (и многое другое) подробно описаны в списке основных функций SQLite.

Следующее должно указать вам правильное направление.

UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\' ) WHERE field LIKE 'C:\afolder\%';


6
Хотя предложение WHERE не обязательно, оно дает немного спокойствия. Без WHERE SqlLite сообщит вам, что была затронута каждая строка в вашей таблице. Используя WHERE, вы получите только дюжину или около того строк, которые вы ожидали, вместо потенциально тысяч.
Weston Wedding

2
@WestonWedding Я сравнил время запроса с предложением WHERE и без него. Без where запрос занимает в два раза больше времени.
Parag Bafna

FYI, это и решение vladkras чувствительно к регистру. Я экспериментировал со вставкой операторов LIKE, чтобы сделать его нечувствительным к регистру, но мне не удалось заставить его работать, я не думаю, что это возможно с помощью команды SQLite Replace.
ShadowLiberal 05

Спасибо. Darktable использует sqlite db для хранения местоположения изображений, так что это сэкономило мне около 9000 изменений!
Фил

30

@ Андрей ответ частично правильный. Здесь нет необходимости использовать WHEREпредложение:

  1. В C:\afolderлюбом случае будут затронуты только содержащиеся поля , нет причин проверять это. Это чрезмерно.
  2. 'C:\afolder\%'выберет только поля, начинающиеся с C:\afolder\. Что, если у вас есть этот путь внутри строки?

Итак, правильный запрос:

UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\');

Заменит ли это строку в каждой строке в столбце «поле»?
Fifaltra 02

@fifaltra, да, будет
повтор

Обратите внимание, что я бы не рекомендовал использовать replace (), когда вы хотите обновить пути к файловой системе, если они относительные (а не абсолютные). См stackoverflow.com/questions/50161090/...
NameZero912

10

И если вы просто хотите сделать это в запросе без длительных последствий:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.