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

?

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\%';


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\');

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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.