Frage

Gibt es eine Äquivalent oder Alternative zu Folgendem?

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

Hat Oracle so etwas wie die Formatierung von Printf -Stil?

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

Lösung

Nein, es gibt keine integrierten Orakelfunktionen, die auf diese Weise eine formatierende Zeichenfolge anwenden. Obwohl es einfach wäre, eine benutzerdefinierte Funktion für dieses spezifische Beispiel zu schreiben, wäre es eine Herausforderung, eine PL/SQL-basierte Implementierung von PRINFF zu schreiben.

Wenn Sie dies häufig benötigen, können Sie möglicherweise eine Orakelfunktion schreiben, die einen Java -Aufruf für eine reichhaltigere Saitenhandhabungsumgebung einbringt.

Andere Tipps

Die nächstgelegene Standardannäherung an printf für Oracle, die ich mir vorstellen kann, ist UTL_LMS.FORMAT_MESSAGE. Es funktioniert jedoch nicht in SQL -Aussagen, das heißt, das ist in Ordnung:

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

Aber das gibt a ORA-00902: Ungültiger Datentyp Error:

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

Nur eine weitere Idee für Sie: Ich habe festgestellt, dass er ersetzt als nützlich für solche Dinge ist, insbesondere wenn die Vorlage komplex ist:

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

Der einzige Nachteil ist, dass Sie so viele hinzufügen müssen REPLACE(Es gibt Variablen, die ersetzen müssen - aber zumindest müssen Sie nur eine pro Variable haben, unabhängig davon, wie oft es in der Vorlage erscheint.

(Hinweis: Die Verwendung von "%" als Trennzeichen hat keine besondere Bedeutung, es ist nur eine persönliche Konvention von mir - Sie könnten ein anderes Muster wählen, z. B. <mix_type> oder [mix_type])

In diesem speziellen Fall sieht es nach Overkill aus, aber in einigen Fällen kann es die Dinge viel einfacher machen, z. B.:

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

Vergleichen Sie die oben genannten mit:

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

Ich habe eine einfache Vorlagemotor mit dem Namen gemacht ora_te (auf github) Für Oracle SQL / PLSQL. Mit Hilfe dessen kann Ihr Ziel auf folgende Weise erreicht werden:

NICHTEffektive Implementierung mit mehreren Paruren der Vorlagenzeichenfolge:

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;

Eine effektive Implementierung mit einmaliger Zusammenstellung (Parsen):

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;

Übrigens unterstützt es auch benannte Platzhalter.

Sie können es in der Auswahl beheben.

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

Sie sollten sich auch die Funktionen ansehen

to_char

miteinander ausgehen

to_number

Da geben sie eine feinere Granularität darüber, wie Sie die dargestellten Dinge wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top