2009-08-23 19 views
5

Tôi có thể khớp và thay thế mẫu văn bản trong MYSQL không?MYSQL: Tìm kiếm tương đương với «regex» = ~ s/e/i/g => rigix trong một MySQL Chọn


EDIT Còn bây giờ có vẻ như câu trả lời là: Không thể được thực hiện, kể từ khi bạn không thể nắm bắt được những gì đã xuất hiện (từ câu trả lời Eric 's/bình luận). Bây giờ tôi sẽ xem xét thêm một bảng tra cứu.


ví dụ đơn giản:

Bảng MySQL Coleridge giữ nhiều chuỗi như:

text 
------------------------------------ 
In_Xanadu_did_Kubla_Khan 
A_stately_pleasure_dome_decree 
Where_Alph_the_sacred_river_ran 
Through_caverns_measureless_to_man 
Down_to_a_sunless_sea 

Có cách nào để diễn tả chọn

CHỌN text = ~ s/[^_] + _ (. *) _ [^ _] + $/\ 1/ khi được thay thế FROM Coleridge

và nhận

replaced 
________________________ 
Xanadu_did_Kubla 
stately_pleasure_dome 
Alph_the_sacred_river 
caverns_measureless_to 
to_a_s 

Xin lưu ý:

  1. Các biểu hiện thường xuyên s///I cung cấp là ít hơn nhiều phức tạp so với những gì thế giới thực DB chứa
  2. Đáng tiếc là tôi có thể 't normalize DB ..

Trả lời

5

Không có cách nào để thay thế bất kỳ thứ gì trong MySQL. Bạn có thể so khớp trong MySQL dựa trên RegEx (regexp), nhưng điều đó không trả lại phần nào được khớp, chỉ toàn bộ cột đó là. Tuy nhiên, bạn có thể sử dụng replace như vậy:

select replace(col, 'e', 'i') from tbl 

này sẽ trở lại regex như rigix.

Như ví dụ cụ thể của bạn, bạn sẽ phải sử dụng một sự kết hợp của locatesubstring:

select 
    substring(col 
     , locate('_', col)+1 
     , locate('_', reverse(col))-(len(col)-locate('_', col)-1)) 
from tbl 

Nguyên tắc chung về thao tác chuỗi/xử lý theo mức độ cơ sở dữ liệu là: Giữ nó đơn giản. RDBMS suy nghĩ trong bộ, và đó là nơi họ tỏa sáng. Kéo các thao tác chuỗi cá nhân không ở vị trí ngọt ngào của chúng. Như vậy, không có RDBMS có chức năng xử lý chuỗi thực sự trưởng thành (và chắc chắn không có bất kỳ sự nhất quán nào trên các hàm khác nhau). Nếu regex của bạn phức tạp một cách hợp lý, bạn rất có thể chỉ muốn xử lý nó trên lớp trình bày/ứng dụng và không phải trong cơ sở dữ liệu.

+0

cảm ơn. tiếc là regex của tôi không thể được thể hiện dễ dàng (trừ khi tôi mã một mess phức tạp của IF/CASE khối sáu feet sâu) .. Tôi sẽ có một từ với DBA .. Tôi có thể phải xây dựng một bảng tra cứu. – lexu

+0

Tôi tin rằng câu trả lời đúng cho câu hỏi của tôi là trong nhận xét của bạn về câu trả lời của chao: Bạn không thể nắm bắt những gì đã được so khớp. – lexu

2

Không, bạn không thể. MySQL chỉ hỗ trợ regexes cho phù hợp (RLIKE), không thay thế.

+4

Điều quan trọng cần lưu ý là bạn không thể nắm bắt những gì đã được so khớp, chỉ cần một cột được đối sánh. – Eric

Các vấn đề liên quan