2012-08-25 32 views
9

Tôi có nội dung html trong cột post_content.SQL: tìm kiếm/thay thế nhưng chỉ lần đầu tiên giá trị xuất hiện trong hồ sơ

Tôi muốn tìm kiếm và thay thế A bằng B nhưng chỉ lần đầu tiên A xuất hiện trong hồ sơ vì nó có thể xuất hiện nhiều lần.

Các truy vấn dưới đây rõ ràng sẽ thay thế tất cả các trường hợp của A với B

UPDATE wp_posts SET post_content = REPLACE (post_content, 'A', 'B');

+0

cơ sở dữ liệu nào? –

+0

cơ sở dữ liệu mysql @gjreda cảm ơn lời giải thích đó. – stemie

+0

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

Trả lời

13

Điều này thực sự nên được những gì bạn muốn trong MySQL:

UPDATE wp_post 
SET post_content = CONCAT(REPLACE(LEFT(post_content, INSTR(post_content, 'A')), 'A', 'B'), SUBSTRING(post_content, INSTR(post_content, 'A') + 1)); 

Đó là một chút phức tạp hơn câu trả lời trước đây của tôi - Bạn cần phải tìm trường hợp đầu tiên của 'A' (sử dụng chức năng INSTR), sau đó sử dụng LEFT kết hợp với REPLACE để thay thế cho trường hợp đó, thay vì sử dụng SUBSTRING và INSTR để tìm cùng 'A' bạn đang thay thế và CONCAT nó bằng chuỗi trước đó.

Xem xét nghiệm của tôi dưới đây:

SET @string = 'this is A string with A replace and An Answer'; 
SELECT @string as actual_string 
, CONCAT(REPLACE(LEFT(@string, INSTR(@string, 'A')), 'A', 'B'), SUBSTRING(@string, INSTR(@string, 'A') + 1)) as new_string; 

Tạo:

actual_string         new_string 
--------------------------------------------- --------------------------------------------- 
this is A string with A replace and An Answer this is B string with A replace and An Answer 
+4

điều này có vẻ không hoạt động đối với chuỗi dài hơn một char :( – Radek

1

Nếu bạn đang sử dụng một Oracle DB, bạn sẽ có thể viết một cái gì đó như:

UPDATE wp_posts SET post_content = regexp_replace(post_content,'A','B',1,1) 

Xem ở đây để biết thêm thông tin: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm

Lưu ý: bạn thực sự nên chăm sóc post_content liên quan đến vấn đề bảo mật vì nó có vẻ là đầu vào của người dùng.

7

Ngoài ra, bạn có thể sử dụng các chức năng LOCATE(), INSERT()CHAR_LENGTH() như thế này:

INSERT(originalvalue, LOCATE('A', originalvalue), CHAR_LENGTH('A'), 'B') 
-1

Để giữ mẫu của gjreda một chút đơn giản hơn sử dụng này:

UPDATE wp_post 
    SET post_content = 
      CONCAT(
       REPLACE(LEFT(post_content, 1), 'A', 'B'), 
       SUBSTRING(post_content, 2) 
      ) 
    WHERE post_content LIKE 'A%'; 
0

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:

  1. Tìm chỉ mục xuất hiện đầu tiên của chuỗi được thay thế.
  2. 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').
  3. Kết hợp với bất kỳ thứ gì bạn đang thay thế chuỗi gốc bằng.
  4. 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
  5. 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ó' :

  1. Index của 'pupper' được 5.
  2. Get trái của 5-1 = 4. vì vậy, chỉ số 1-4, đó là 'lil_'
  3. cONCATENATE 'chó' cho 'lil_dog'
  4. 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'.
  5. 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ác vấn đề liên quan