SQLite - substitui parte de uma string

104

É possível usar SQLem uma SQLitetabela para substituir parte de uma string?

Por exemplo, eu tenho uma tabela onde um dos campos contém o caminho para um arquivo. É possível substituir partes da corda para que, por exemplo

c:\afolder\afilename.bmp

torna-se

c:\anewfolder\afilename.bmp

?

Colin
fonte

Respostas:

207

Você pode usar a replace()função incorporada para realizar uma substituição de string em uma consulta.

Outras funções de manipulação de string (e mais) são detalhadas na lista de funções principais do SQLite

O que segue deve apontar a direção certa.

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

Andrew
fonte
6
Embora a cláusula WHERE não seja necessária, ela proporciona um pouco de paz de espírito. Sem WHERE, SqlLite dirá a você que todas as linhas em sua tabela foram afetadas. Usando WHERE, você obterá apenas a dezena ou mais de linhas que esperava, em vez de potencialmente milhares.
Casamento em Weston
2
@WestonWedding Eu comparei o tempo de consulta com e sem a cláusula WHERE. Sem onde a consulta está demorando duas vezes.
Parag Bafna
Para sua informação, esta solução e a de vladkras diferenciam maiúsculas de minúsculas. Experimentei inserir instruções LIKE para não diferenciar maiúsculas de minúsculas, mas não consegui fazer funcionar, não acho que seja possível com o comando SQLite Replace.
ShadowLiberal
Obrigado. Darktable usa um banco de dados sqlite para armazenar a localização das imagens, então isso me salvou cerca de 9.000 alterações!
Phil
30

A resposta de @Andrew está parcialmente correta. Não há necessidade de usar a WHEREcláusula aqui:

  1. Apenas os campos contendo C:\afolderserão afetados de qualquer maneira, não há razão para verificar isso. É excessivo.
  2. 'C:\afolder\%'irá escolher apenas os campos que começam com C:\afolder\only. E se você tiver esse caminho dentro da string?

Portanto, a consulta correta é apenas:

UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\');
vladkras
fonte
Isso substituirá a string em cada string na coluna "campo"?
fifaltra
@fifaltra sim vai
resedasue em
Observe que eu não recomendaria usar replace () quando você deseja atualizar os caminhos do sistema de arquivos no caso de serem relativos (em vez de absolutos). Consulte stackoverflow.com/questions/50161090/…
NameZero912
10

E se você quiser fazer isso apenas em uma consulta sem consequências duradouras:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
bugmenot123
fonte