Chỉ cần một ý tưởng dành cho bạn: Tôi đã tìm thấy REPLACE để thể hữu ích cho loại điều, đặc biệt là khi các mẫu phức tạp:
SELECT REPLACE(REPLACE(
'%mix_type% (%mix_num%)' /*template*/
,'%mix_type%', mix_type)
,'%mix_num%' , mix_num) as description,
FROM acid_batch
WHERE mix_num < 10
Nhược điểm duy nhất là bạn cần phải thêm bao nhiêu REPLACE(
' Vì có các biến để thay thế - nhưng ít nhất bạn chỉ cần có một biến cho mỗi biến, bất kể số lần nó xuất hiện trong mẫu.
(Chú ý: Không có ý nghĩa đặc biệt với việc sử dụng "%" như một dấu phân cách, nó chỉ là một quy ước cá nhân của tôi - bạn có thể chọn một mô hình khác nhau, ví dụ như <mix_type>
hoặc [mix_type]
)
Đối đặc biệt này Ví dụ có vẻ như quá mức cần thiết, nhưng trong một số trường hợp nó có thể làm cho mọi việc dễ dàng hơn nhiều, ví dụ:
template := 'bla bla %a% %b% %a%';
output := REPLACE(REPLACE(template
,'%a%', some_complex_expression)
,'%b%', b);
So sánh trên với:
output := 'bla bla ' || some_complex_expression || ' ' || b || ' ' || some_complex_expression;
Nguồn
2009-06-17 01:14:41
Cú pháp của (str_a || '' || str_b) hoặc trên để bao quanh một chuỗi có dấu ngoặc đơn có vẻ xấu xí (đối với mã) và khó đọc. Nó chỉ có vẻ như nên có một cách thanh lịch hơn. – Steven
Một giải pháp khác là viết một gói pl/sql có các đối số và định dạng mọi thứ theo cách bạn muốn. – EvilTeach
Thật không may PL/SQL không (chưa) hỗ trợ số lượng biến và các loại tham số cho một chức năng - cách gần nhất sẽ được thực hiện FUNCTION printf (t varchar2, v1 varchar2: = null, v2 varchar2: = null, v3 varchar2: = null, v4 varchar2: = null, v5 varchar2: = null) RETURN VARCHAR2 (thêm các tham số varchar2 bổ sung nếu bạn cần chúng). Mặc dù tôi muốn xem xét đổi tên nó vì mục đích của printf là gửi kết quả đến stdout, trong khi ở đây bạn đang mong đợi nó chỉ đơn giản trả về chuỗi kết quả. –