SQLite - zamień część łańcucha


104

Czy można użyć SQLw SQLitetabeli do zastąpienia części łańcucha?

Na przykład mam tabelę, w której jedno z pól zawiera ścieżkę do pliku. Czy istnieje możliwość wymiany części struny tak, aby np

c:\afolder\afilename.bmp

staje się

c:\anewfolder\afilename.bmp

?

Odpowiedzi:


207

Możesz użyć wbudowanej replace()funkcji, aby wykonać zamianę ciągu w zapytaniu.

Inne funkcje manipulacji na łańcuchach (i nie tylko) są szczegółowo opisane na liście podstawowych funkcji SQLite

Poniższe wskazówki powinny wskazywać właściwy kierunek.

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


6
Chociaż klauzula WHERE nie jest konieczna, daje trochę spokoju. Bez GDZIE SqlLite powie ci, że dotyczy to każdego wiersza w twojej tabeli. Używając GDZIE, otrzymasz tylko kilkanaście wierszy, których oczekiwałeś, zamiast potencjalnie tysięcy.
Wesele Weston

2
@WestonWedding Porównałem czas zapytań zi bez klauzuli WHERE. Bez gdzie zapytanie trwa dwa razy.
Parag Bafna

FYI, w tym rozwiązaniu i rozwiązaniu vladkras rozróżniana jest wielkość liter. Eksperymentowałem z wstawianiem instrukcji LIKE, aby nie uwzględniać wielkości liter, ale nie mogłem go uruchomić, nie sądzę, aby było to możliwe z poleceniem SQLite Replace.
ShadowLiberal

Dzięki. Darktable używa bazy danych sqlite do przechowywania lokalizacji obrazów, więc zaoszczędziło mi to około 9000 zmian!
Phil,

30

@Andrew odpowiedź jest częściowo poprawna. Nie ma potrzeby używania WHEREklauzuli tutaj:

  1. I C:\afoldertak wpłynie to tylko na pola zawierające , nie ma powodu, aby to sprawdzić. To jest przesadne.
  2. 'C:\afolder\%'wybierze tylko pola zaczynające się C:\afolder\tylko od. A co, jeśli masz tę ścieżkę w ciągu?

Zatem poprawne zapytanie to po prostu:

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

Czy spowoduje to zastąpienie ciągu w każdym ciągu w kolumnie „pole”?
fifaltra

@fifaltra yes it will
resedasue

Zwróć uwagę, że nie polecam używania funkcji replace (), gdy chcesz zaktualizować ścieżki systemu plików, jeśli są względne (zamiast bezwzględne). Zobacz stackoverflow.com/questions/50161090/…
NameZero912

10

A jeśli chcesz to zrobić w zapytaniu bez trwałych konsekwencji:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.