13

以下是否有等效或替代方法?

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
4

5 回答 5

24

我能想到的最接近 Oracle 的 printf 标准近似值是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: invalid datatype错误:

select utl_lms.format_message('hello %s, the number is %d', 'world', 42)
  from dual
于 2012-03-16T09:40:32.067 回答
7

不,没有以这种方式应用格式化字符串的内置 Oracle 函数。尽管为这个特定示例编写自定义函数很容易,但编写基于 PL/SQL 的 printf 实现将是一项挑战。

如果您经常需要这样做,也许您可​​以编写一个 Oracle 函数来包装 Java 调用以获得更丰富的字符串处理环境。

于 2009-06-16T20:30:29.363 回答
3

给你的另一个想法:我发现 REPLACE 对这种事情很有用,特别是当模板很复杂时:

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(要替换的变量一样多的 's - 但至少每个变量只需要一个,无论它在模板中出现多少次。

(注意:使用“%”作为分隔符没有特别的意义,这只是我的个人习惯——你可以选择不同的模式,例如<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;
于 2009-06-17T01:14:41.490 回答
3

我为 Oracle SQL / PLSQL制作了一个名为ora_te(在 GitHub 上)的简单模板引擎。借助它,您可以通过以下方式实现目标:

模板字符串多次解析的无效实现:

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;

顺便说一句,它还支持命名占位符。

于 2015-04-29T15:49:45.360 回答
0

您可以在选择中解决它。

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

你还应该看看函数

to_char

迄今为止

to_number

因为它们为您提供了关于您希望如何表示事物的更精细的粒度。

于 2009-06-16T20:15:11.627 回答