Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So formatieren Sie eine Zahl mit einem Komma in Oracle

Wenn Sie TO_CHAR() verwenden Um eine Zahl in Oracle zu formatieren, verwenden Sie ein Formatmodell, um zu bestimmen, wie die Zahl formatiert werden soll.

Beispielsweise könnten Sie eine Zahl wie 12,345.00 formatieren oder wie 12,345.00 , abhängig von Ihrem Gebietsschema.

Das Formatmodell kann den G enthalten oder D format-Elemente, um einer Zahl ein Komma hinzuzufügen. Welche Sie verwenden, hängt davon ab, ob Sie das Komma als Tausendertrennzeichen oder als Dezimalzeichen verwenden möchten.

Alternativ können Sie ein echtes Kommazeichen verwenden (, ), wenn Sie es vorziehen, obwohl diese Methode nicht wie G gebietsschemaabhängig ist und D Formatelemente sind.

Das G und D Formatelemente

Hier ist ein Beispiel zur Veranschaulichung des G und D Formatelemente:

SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;

Ergebnis:

12,345.00

In diesem Fall gibt das Gruppentrennzeichen ein Komma und das Dezimalzeichen einen Punkt aus. Das liegt daran, dass meine aktuelle Sitzung NLS_TERRITORY ist Parameter ist auf Australia gesetzt .

Folgendes passiert, wenn ich mein NLS_TERRITORY ändere Parameter auf Germany :

ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;

Ergebnis:

12,345.00

Jetzt wird das Komma für das Dezimalzeichen verwendet.

Zur schnellen Erklärung des obigen Formatmodells:

  • Der fm Der Formatmodifikator unterdrückt jegliches Padding, das auf das Ergebnis angewendet werden könnte.
  • Die 9 Zeichen stehen für Zahlen.
  • Die 0 Zeichen stellt Zahlen dar, ohne führende oder nachgestellte Nullen zu unterdrücken.

Hier ist eine vollständige Liste der Zahlenformatelemente, die Sie als Kurzreferenz verwenden können.

Tdie NLS_NUMERIC_CHARACTERS Parameter

Wenn wir NLS_TERRITORY setzen -Parameter (wie im vorherigen Beispiel), setzt dies implizit eine Reihe anderer Parameter, einschließlich NLS_NUMERIC_CHARACTERS Parameter.

Tdie NLS_NUMERIC_CHARACTERS Parameter bestimmt, welche Zeichen für das Gruppentrennzeichen und das Dezimalzeichen verwendet werden.

Wir können die V$NLS_PARAMETERS abfragen Ansicht, um zu sehen, welche Zeichen für das Gruppentrennzeichen und das Dezimalzeichen verwendet werden:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';

Ergebnis:

,.

Hier sehen wir, dass das Dezimalzeichen durch ein Komma und das Gruppentrennzeichen durch einen Punkt dargestellt wird.

Sie können den Wert von NLS_NUMERIC_CHARACTERS ändern Parameter direkt, wenn Sie möchten (d.h. ohne das NLS_TERRITORY zu ändern Parameter).

ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,';
SELECT TO_CHAR(12345, 'fm99G999D00')
FROM DUAL;

Ergebnis:

12,345.00

Dies sollten Sie jedoch wahrscheinlich vermeiden, da dies zu einer Unterbrechung zwischen den NLS-Parametern führt. Ihre NLS-Parameter spiegeln nicht mehr die Standardwerte für das aktuelle Gebiet wider. Sofern Sie keinen triftigen Grund dagegen haben, ist es normalerweise besser, NLS_TERRITORY zu ändern Parameter auf das relevante Gebiet, sodass auch andere Parameter auf ihre Standardwerte für das neue Gebiet aktualisiert werden können.

Der 'nlsparam' Argument

Eine Sache, die ich erwähnen sollte, ist, dass T0_CHAR() Die Funktion akzeptiert ein drittes Argument, mit dem Sie vorübergehend verschiedene NLS-Parameter festlegen können, einschließlich der NLS_NUMERIC_CHARACTERS Parameter. Wenn Sie dies auf Funktionsebene tun, wird der Wert dieser Parameter für die aktuelle Sitzung nicht geändert.

Hier ist ein Beispiel:

ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT 
    TO_CHAR(12345, 'fm99G999D00') AS "r1",
    TO_CHAR(
        12345, 'fm99G999D00',
        'NLS_NUMERIC_CHARACTERS = ''.,'''
        ) AS "r2",
    TO_CHAR(12345, 'fm99G999D00') AS "r3"
FROM DUAL;

Ergebnis:

          r1           r2           r3 
____________ ____________ ____________ 
12.345,00    12,345.00    12.345,00   

Hier habe ich das Gebiet der Sitzung auf Deutschland festgelegt und dann TO_CHAR() aufgerufen dreimal.

  • Der erste Aufruf verwendet die NLS-Parameter der Sitzung. Das bedeutet, dass das standardmäßige Gruppentrennzeichen ein Punkt ist.
  • Im zweiten Aufruf setze ich explizit meine eigenen NLS_NUMERIC_CHARACTERS Parameter innerhalb der Funktion. In diesem Fall setze ich das Gruppentrennzeichen auf ein Komma. Wie der dritte Aufruf zeigt, hatte dies keine Auswirkungen auf die NLS-Parameter meiner Sitzung.
  • Der dritte Aufruf verwendet die NLS-Parameter der Sitzung, genau wie der erste Aufruf. Wie wir sehen können, sind das Gruppentrennzeichen und das Dezimalzeichen von der (vorübergehenden) Änderung, die wir in unserem zweiten Aufruf vorgenommen haben, nicht betroffen.

Fest codiertes Komma

Eine andere Möglichkeit, einer Zahl ein Komma hinzuzufügen, besteht darin, sie in Ihrem Formatmodell fest zu codieren.

Beispiel:

ALTER SESSION SET NLS_TERRITORY = 'Germany';
SELECT TO_CHAR(12345, 'fm99,999.00')
FROM DUAL;

Ergebnis:

12,345.00

In diesem Fall habe ich das Komma und den Punkt fest codiert. Dadurch wird das in NLS_NUMERIC_CHARACTERS festgelegte Gruppentrennzeichen ignoriert Parameter.

Mehrere Kommas

Innerhalb eines Formatmodells können mehrere Kommas und/oder Gruppentrennzeichen vorhanden sein.

Beispiel:

ALTER SESSION SET NLS_TERRITORY = 'Australia';
SELECT TO_CHAR(123456789, 'fm999G999G999D00')
FROM DUAL;

Ergebnis:

123,456,789.00

Ungültige Kommaplatzierung

Ein Komma oder Gruppentrennzeichen darf in einem Zahlenformatmodell nicht rechts von einem Dezimalzeichen oder Punkt stehen.

SELECT TO_CHAR(12345, 'fm99D999G00')
FROM DUAL;

Ergebnis:

Error report -
ORA-01481: invalid number format model