Giải pháp của Greg Reda không làm việc cho tôi trên chuỗi dài hơn 1 ký tự do cách REPLACE() được viết (chỉ thay thế ký tự đầu tiên của chuỗi được thay thế). Đây là giải pháp mà tôi tin là hoàn chỉnh hơn và bao gồm mọi trường hợp sử dụng của sự cố khi được định nghĩa là Làm cách nào để thay thế sự xuất hiện đầu tiên của "Chuỗi A" bằng "Chuỗi B" trong "Chuỗi C"?
CONCAT(LEFT(buycraft, INSTR(buycraft, 'blah') - 1), '', SUBSTRING(buycraft FROM INSTR(buycraft, 'blah') + CHAR_LENGTH('blah')))
này giả định rằng bạn chắc chắn rằng mục ĐÃ chứa chuỗi phải được thay thế! Nếu bạn thử thay thế 'con chó' bằng 'con mèo' trong chuỗi 'con rối', nó sẽ cho bạn 'mỗi', đó không phải là điều bạn muốn. Dưới đây là một truy vấn để xử lý mà bằng cách đầu tiên kiểm tra xem chuỗi phải được thay thế tồn tại trong chuỗi đầy đủ:
IF(INSTR(buycraft, 'blah') <> 0, CONCAT(LEFT(buycraft, INSTR(buycraft, 'blah') - 1), '', SUBSTRING(buycraft FROM INSTR(buycraft, 'blah') + CHAR_LENGTH('blah'))), buycraft)
Các trường hợp sử dụng cụ thể ở đây là thay thế các trường hợp đầu tiên của 'blah' bên cột 'buycraft' với một chuỗi rỗng ''.Tôi nghĩ rằng một giải pháp khá trực quan và tự nhiên:
- Tìm chỉ mục xuất hiện đầu tiên của chuỗi được thay thế.
- Nhận mọi thứ ở bên trái của điều đó, không bao gồm chính chỉ mục (do đó '-1').
- Kết hợp với bất kỳ thứ gì bạn đang thay thế chuỗi gốc bằng.
- Tính chỉ mục kết thúc của một phần của chuỗi đang được thay thế. Điều này có thể dễ dàng thực hiện bằng cách tìm lại chỉ số của lần xuất hiện đầu tiên và thêm chiều dài của chuỗi được thay thế. Điều này sẽ cung cấp cho bạn những chỉ số của char đầu tiên sau chuỗi gốc
- CONCATENATE các chuỗi con bắt đầu từ chỉ số kết thúc của chuỗi
Một ví dụ hương thay thế "pupper" trong "lil_puppers_yay" với 'chó' :
- Index của 'pupper' được 5.
- Get trái của 5-1 = 4. vì vậy, chỉ số 1-4, đó là 'lil_'
- cONCATENATE 'chó' cho 'lil_dog'
- Tính chỉ mục kết thúc. Chỉ mục bắt đầu là 5 và chiều dài 5 + của 'pupper' = 11. Lưu ý rằng chỉ mục 11 đề cập đến 's'.
- Ghép nối chuỗi con bắt đầu từ chỉ mục kết thúc, là 's_yay', để nhận 'lil_dogs_yay'.
Đã xong!
Lưu ý: SQL có 1 chuỗi được lập chỉ mục (là người mới bắt đầu SQL, tôi không biết điều này trước khi tôi tìm ra vấn đề này). Ngoài ra, SQL LEFT và SUBSTRING dường như hoạt động với các chỉ mục không hợp lệ theo cách lý tưởng (điều chỉnh nó ở đầu hoặc cuối của chuỗi), rất thuận tiện cho người mới bắt đầu SQLer như tôi: P
Lưu ý khác: Tôi là một người mới bắt đầu với SQL và đây là truy vấn khó nhất mà tôi từng viết, vì vậy có thể có một số sự thiếu hiệu quả. Nó được công việc thực hiện chính xác mặc dù.
cơ sở dữ liệu nào? –
cơ sở dữ liệu mysql @gjreda cảm ơn lời giải thích đó. – stemie
Im sử dụng cơ sở dữ liệu mysql. @gjreda cảm ơn, tôi đã thử truy vấn đó nhưng gặp lỗi. # 1064 - Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn cho cú pháp đúng để sử dụng gần 'UPDATE wp_posts SET post_content = REPLACE (SUBSTRING_INDEX (post_content,' A ',' tại dòng 1 – stemie