Domanda

Esiste un equivalente o un'alternativa al seguente?

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

Oracle ha qualcosa di simile alla formattazione dello stile printf?

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

Soluzione

No, non esistono funzioni Oracle integrate che applicano una stringa di formattazione in questo modo. Sebbene sarebbe facile scrivere una funzione personalizzata per questo esempio specifico, scrivere un'implementazione di printf basata su PL / SQL sarebbe difficile.

Se ne hai bisogno frequente, forse potresti scrivere una funzione Oracle che avvolge una chiamata Java per un ambiente di gestione delle stringhe più ricco.

Altri suggerimenti

L'approssimazione standard più vicina a printf per Oracle che mi viene in mente è utl_lms.format_message . Tuttavia, non funzionerà nelle istruzioni SQL, ovvero va bene:

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

ma ciò fornisce un ORA-00902: errore di tipo di dati non valido:

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

Solo un'altra idea per te: ho trovato REPLACE utile per questo tipo di cose, specialmente quando il modello è complesso:

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

L'unico aspetto negativo è che devi aggiungere quante REPLACE( quante sono le variabili da sostituire, ma almeno devi averne una per variabile, indipendentemente da quante volte appare nel modello.

(NOTA: non c'è un significato particolare nell'uso di "% " come delimitatore, è solo una mia convenzione personale - potresti scegliere un modello diverso, ad esempio <mix_type> o [mix_type])

Per questa particolare istanza sembra eccessivo, ma in alcuni casi può rendere le cose molto più semplici, ad es .:

template := 'bla bla %a% %b% %a%';
output := REPLACE(REPLACE(template
    ,'%a%', some_complex_expression)
    ,'%b%', b);

Confronta quanto sopra con:

output := 'bla bla ' || some_complex_expression || ' ' || b || ' ' || some_complex_expression;

Ho creato un semplice motore modello chiamato ora_te (su GitHub) per Oracle SQL / PLSQL . Con l'aiuto di esso il tuo obiettivo può essere raggiunto nei seguenti modi:

Implementazione senza effetti con più analisi della stringa del modello:

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;

Un'implementazione efficace con una sola compilazione (analisi):

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;

A proposito, supporta anche i segnaposto nominati.

Puoi risolverlo nella selezione.

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

dovresti anche dare un'occhiata alle funzioni

to_char

to_date

to_number

dato che ti danno una granularità più fine su come vuoi che siano rappresentate le cose.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top