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 не є необхідним, він дає трохи спокою. Без ДЕ, SqlLite скаже вам, що кожен рядок у вашій таблиці впливав. Використовуючи WHERE, ви отримаєте лише десяток або близько того рядків, яких ви очікували, замість потенційно тисяч.
Вестонське весілля

2
@WestonWedding Я порівняв час запитів із пунктом WHERE і без нього. Без того, де запит займає двічі.
Параг Бафна

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

Дякую. Darktable використовує sqlite db для зберігання розташування зображень, тому це врятувало мені близько 9000 змін!
Філ

30

@Andrew відповідь частково правильна. Тут не потрібно використовувати WHEREпункт:

  1. Лише поля, що містять C:\afolder, впливатимуть у будь-якому випадку, і немає причин перевіряти це. Це надмірно.
  2. 'C:\afolder\%'вибере лише поля, починаючи з C:\afolder\лише. Що робити, якщо у вас є цей шлях всередині рядка?

Тож правильний запит просто:

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

Чи замінить це рядок у кожному рядку у стовпці "поле"?
п’ятільтра

@fifaltra так це буде
resedasue

Зауважте, що я б не рекомендував використовувати заміну (), коли ви хочете оновити контури файлової системи, якщо вони відносні (замість абсолютних). Див 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.