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를 사용하면 잠재적으로 수천 개가 아닌 12 개 정도의 행만 얻을 수 있습니다.
— Weston Wedding

2
@WestonWedding WHERE 절이있는 경우와없는 경우 쿼리 시간을 비교했습니다. 쿼리가 두 번 걸리는 곳없이.
— Parag Bafna

참고로, 이것과 vladkras의 솔루션은 대소 문자를 구분합니다. 대소 문자를 구분하지 않도록 LIKE 문을 삽입하는 실험을했지만 제대로 작동하지 않았고 SQLite Replace 명령으로는 가능하지 않다고 생각합니다.
— ShadowLiberal

감사. Darktable은 sqlite db를 사용하여 이미지 위치를 저장하므로 약 9000 개의 변경 사항이 저장되었습니다!
— Phil

30

@Andrew 답변은 부분적으로 정확합니다. WHERE여기에 절 을 사용할 필요가 없습니다 .

  1. C:\afolder어쨌든 포함 된 필드 만 영향을받으며 확인할 이유가 없습니다. 과도합니다.
  2. 'C:\afolder\%'로 시작하는 필드 만 선택합니다 C:\afolder\. 문자열 안에이 경로가 있으면 어떨까요?

따라서 올바른 쿼리는 다음과 같습니다.

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

"필드"열에있는 모든 문자열의 문자열이 대체됩니까?
— fifaltra

@fifaltra 예는 것
— resedasue

파일 시스템 경로가 상대적인 경우 (절대 대신) 업데이트하려는 경우 replace ()를 사용하지 않는 것이 좋습니다. stackoverflow.com/questions/50161090/
— NameZero912

10

지속적인 결과없이 쿼리에서 수행하려는 경우 :

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.