甲骨文printf的'等价(Oracle 'printf' equivale

2019-07-28 20:28发布

是否有同等或替代以下?

SELECT mix_type || ' (' || mix_num || ')' as description
  FROM acid_batch
 WHERE mix_num < 10

Oracle是否有类似的printf样式格式?

SELECT printf("%s (%s)", mix_type, mix_num) as description,
  FROM acid_batch
 WHERE mix_num < 10

Answer 1:

没有没有内置的是,在这种方式应用格式字符串的Oracle功能。 尽管它会很容易编写自定义函数为这个具体的例子,写的printf的基于SQL PL /实施将是具有挑战性的。

如果你有一个经常需要这个,也许你可以写一个包装了Java调用了更丰富的字符串处理环境中的Oracle功能。



Answer 2:

最接近的标准近似给printf为Oracle我能想到的是utl_lms.format_message 。 但是,它不会在SQL语句的工作,那就是,这是确定:

begin
  dbms_output.put_line(
    utl_lms.format_message('hello %s, the number is %d', 'world', 42)
  );
end;
/

但是这给出了一个ORA-00902:无效数据类型的错误:

select utl_lms.format_message('hello %s, the number is %d', 'world', 42)
  from dual


Answer 3:

只是一个想法你:我发现更换待了这种事情,特别是当模板是复杂的有用:

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;


Answer 4:

我做了一个名为简单的模板引擎ora_te(GitHub上)为Oracle SQL / PLSQL。 有了它的帮助下你的目标可以通过以下方式来实现:

无效药实现与模板字符串的多个parsings:

with acid_batch as (
  select rownum as mix_type, rownum + 2 as mix_num 
  from all_objects
  where rownum < 10
)
--
SELECT pk_te.substitute('$1 ($2)', ty_p( mix_type, mix_num ) ) as description
FROM acid_batch
WHERE mix_num < 10;

有效地执行一个时间编译(解析):

with acid_batch as (
  select rownum as mix_type, rownum + 2 as mix_num 
  from all_objects
  where rownum < 10
),
--
o as ( 
  select ty_te.compile_numbered( '$1 ($2)' ) te from dual
)
SELECT pk_te.substitute( o.te, ty_p( mix_type, mix_num ) ) as description
FROM acid_batch, o
WHERE mix_num < 10;

BTW它也支持指定的占位符。



Answer 5:

您可以在选择解决它。

SELECT mix_type || '(' ||  mix_num || ')' as description,
FROM acid_batch
WHERE mix_num < 10

你也应该看看功能

TO_CHAR

至今

TO_NUMBER

因为他们给你怎么想所代表的东西你一个更细的粒度。



文章来源: Oracle 'printf' equivalent