Đối với một số loại trừ lẫn nhau thay thế, các câu lệnh thay thế lồng nhau là cách đơn giản và nhanh nhất. Chỉ cần như @Gordon đề xuất .
Nhưng điều đó không hiệu quả đối với nhiều thiết bị thay thế và có cạm bẫy :
Chuỗi con
Nó trở nên mơ hồ khi các chuỗi có thể là chuỗi con của nhau. Hãy xem xét hai biểu thức sau:
SELECT replace((replace('2015 (Monday)', 'day', 'snake'), 'Monday', 'dog')
, replace((replace('2015 (Monday)', 'Monday', 'dog'), 'day', 'snake');
Kết quả phụ thuộc vào trình tự thay thế. Bạn phải xác định các ưu tiên. Thông thường, bạn sẽ thay thế các chuỗi dài hơn trước.
Chuỗi
Sau đó, cũng có khả năng rằng một sự thay thế có thể tạo ra một kết quả phù hợp cho phần tiếp theo:
SELECT replace((replace('2015 (Sunday)', 'Sun', 'Mon'), 'Monday', 'dog')
, replace((replace('2015 (Sunday)', 'Monday', 'dog'), 'Sun', 'Mon');
Một lần nữa, bạn phải xác định các ưu tiên.
Mọi sự thay thế đều có thể ảnh hưởng đến việc thay thế tiếp theo. Với nhiều hơn một vài lần thay thế, điều này trở nên âm u và dễ xảy ra lỗi nhanh chóng. Cũng rất khó bảo trì nếu thay thế có thể thay đổi.
Như tôi đã nói, chỉ với các ngày trong tuần, replace()
lồng nhau tuyên bố là tốt. Đó không thực sự là "động". Nếu các ngày trong tuần chỉ để minh họa vấn đề và bạn thực sự phải đối phó với nhiều trường hợp hơn hoặc các chuỗi thực sự động, tôi sẽ xem xét một cách tiếp cận khác. Tìm giải pháp động trong câu trả lời có liên quan này: