SQLite - thay thế một phần của chuỗi


104

Có thể sử dụng SQLtrong một SQLitebảng để thay thế một phần của chuỗi không?

Ví dụ: tôi có một bảng trong đó một trong các trường chứa đường dẫn đến tệp. Có thể thay thế các phần của chuỗi để không, ví dụ:

c:\afolder\afilename.bmp

trở thành

c:\anewfolder\afilename.bmp

?

Câu trả lời:


207

Bạn có thể sử dụng replace()hàm tích hợp để thực hiện thay thế chuỗi trong truy vấn.

Các hàm thao tác chuỗi khác (và hơn thế nữa) được trình bày chi tiết trong danh sách các hàm cốt lõi của SQLite

Những điều sau đây sẽ giúp bạn đi đúng hướng.

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


6
Mặc dù mệnh đề WHERE không cần thiết nhưng nó mang lại một chút an tâm. Không có WHERE, SqlLite sẽ cho bạn biết rằng mọi hàng trong bảng của bạn đã bị ảnh hưởng. Bằng cách sử dụng WHERE, bạn sẽ chỉ nhận được hàng chục hoặc hơn bạn mong đợi thay vì hàng nghìn.
Đám cưới Weston

2
@WestonWedding Tôi đã so sánh thời gian truy vấn có và không có mệnh đề WHERE. Không có nơi truy vấn đang mất hai lần thời gian.
Parag Bafna

FYI, giải pháp này và giải pháp của vladkras phân biệt chữ hoa chữ thường. Tôi đã thử nghiệm với việc chèn các câu lệnh LIKE để phân biệt chữ hoa chữ thường, nhưng tôi không thể làm cho nó hoạt động, tôi không nghĩ là có thể thực hiện được với lệnh SQLite Replace.
ShadowLiberal

Cảm ơn. Darktable sử dụng sqlite db để lưu trữ vị trí của hình ảnh, vì vậy điều này đã giúp tôi tiết kiệm được khoảng 9000 thay đổi!
Phil

30

Câu trả lời @Andrew đúng một phần. Không cần sử dụng WHEREmệnh đề ở đây:

  1. Chỉ các trường có chứa C:\afoldersẽ bị ảnh hưởng, không có lý do gì để kiểm tra nó. Nó quá đáng.
  2. 'C:\afolder\%'sẽ chỉ chọn các trường bắt đầu bằng C:\afolder\duy nhất. Điều gì sẽ xảy ra nếu bạn có đường dẫn này bên trong chuỗi?

Vì vậy, truy vấn chính xác chỉ là:

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

Điều này sẽ thay thế chuỗi trong mọi chuỗi trong cột "trường"?
Fifaltra

@fifaltra vâng, nó sẽ
dời lại

Lưu ý rằng tôi không khuyên bạn nên sử dụng Replace () khi bạn muốn cập nhật đường dẫn hệ thống tệp trong trường hợp chúng là tương đối (thay vì tuyệt đối). Xem stackoverflow.com/questions/50161090/…
NameZero912

10

Và nếu bạn chỉ muốn thực hiện nó trong một truy vấn mà không có hậu quả lâu dài:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.