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: 無効なデータ型エラーが発生します:

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

いいえ、この方法でフォーマット文字列を適用する組み込みの Oracle 関数はありません。この特定の例のカスタム関数を作成するのは簡単ですが、printf の PL/SQL ベースの実装を作成するのは困難です。

これが頻繁に必要になる場合は、Java 呼び出しをラップする Oracle 関数を記述して、よりリッチな文字列処理環境を実現できます。

于 2009-06-16T20:30:29.363 に答える
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;

1 回のコンパイル (解析) による効果的な実装:

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 に答える
3

もう 1 つのアイデア: 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(、置換する変数と同じ数の を追加する必要があることですが、テンプレートに何回表示されるかに関係なく、少なくとも変数ごとに 1 つだけ必要です。

(注: 区切り文字として「%」を使用することに特別な意味はありません。これは私の個人的な慣習にすぎません。別のパターンを選択することもできます。たとえば<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 に答える
0

選択で解決できます。

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

関数も見てみる必要があります

to_char

現在まで

宛先番号

物事をどのように表現したいかについて、より細かい粒度を与えるからです。

于 2009-06-16T20:15:11.627 に答える