又一個主意,你:我發現更換待了這種事情,特別是當模板是複雜的有用:
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
唯一的缺點是你需要添加儘可能多的REPLACE(
「因爲有變量需要替換 - 但是至少你只需要每個變量都有一個變量,而不管它在模板中出現多少次。
(注:還有就是要使用「%」作爲分隔符,沒有特別的意義,它是我的只是個人的約定 - 你可以選擇不同的模式,如<mix_type>
或[mix_type]
)
對於這個特定的比如,它看起來像矯枉過正,但在某些情況下,它可以使事情變得更加簡單,例如:
template := 'bla bla %a% %b% %a%';
output := REPLACE(REPLACE(template
,'%a%', some_complex_expression)
,'%b%', b);
比較上面:
output := 'bla bla ' || some_complex_expression || ' ' || b || ' ' || some_complex_expression;
(str_a ||''|| str_b)或上面用括號括起來的字符串的語法看起來很難看(對於代碼)並且難以閱讀。它似乎應該有一個更優雅的方式。 – Steven 2009-06-16 17:51:04
另一個解決方案是編寫一個需要參數的pl/sql包,並按照您希望的方式對其進行格式化。 – EvilTeach 2009-06-16 20:26:17
不幸的是,PL/SQL不支持函數的變量數量和類型參數 - 最接近的方法是實現函數printf(t varchar2,v1 varchar2:= null,v2 varchar2:= null,v3 varchar2:= null,v4 varchar2:= null,v5 varchar2:= null)RETURN VARCHAR2(如果需要,可添加其他varchar2參數)。雖然我會考慮重命名它,因爲printf的目的是將結果發送到stdout,而在這裏您只希望它返回結果字符串。 – 2009-06-17 01:19:23