sql >> Databasteknik >  >> RDS >> Oracle

Hur man formaterar ett tal med kommatecken i Oracle

När du använder TO_CHAR() funktion för att formatera ett tal i Oracle använder du en formatmodell för att bestämma hur talet ska formateras.

Du kan till exempel formatera ett tal som 12,345.00 eller som 12.345,00 , beroende på din plats.

Formatmodellen kan inkludera G eller D formatera element för att lägga till ett kommatecken till ett tal. Vilken du använder beror på om du vill ha kommatecken som tusentalsavgränsare eller som decimaltecken.

Alternativt kan du använda ett faktiskt kommatecken (, ) om du föredrar, även om den här metoden inte är medveten om lokalitet som G och D formatelement är.

G och D Formatera element

Här är ett exempel för att demonstrera G och D formatelement:

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

Resultat:

12,345.00

I det här fallet matar gruppavgränsaren ett kommatecken och decimaltecknet matar ut en punkt. Det beror på att min nuvarande sessions NLS_TERRITORY parametern är inställd på Australia .

Det här är vad som händer om jag ändrar min NLS_TERRITORY parameter till Germany :

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

Resultat:

12.345,00

Nu används kommatecken för decimaltecknet.

Som en snabb förklaring av ovanstående formatmodell:

  • fm formatmodifierare undertrycker all utfyllnad som kan tillämpas på resultatet.
  • 9 tecken representerar siffror.
  • 0 tecken representerar siffror utan att undertrycka några inledande eller avslutande nollor.

Här är en fullständig lista över talformatelement som du kan använda som en snabbreferens.

Than NLS_NUMERIC_CHARACTERS Parameter

När vi ställer in NLS_TERRITORY parameter (som i föregående exempel), ställer detta implicit in ett gäng andra parametrar, inklusive NLS_NUMERIC_CHARACTERS parameter.

Than NLS_NUMERIC_CHARACTERS parametern bestämmer vilka tecken som används för gruppseparatorn och decimaltecken.

Vi kan fråga V$NLS_PARAMETERS visa för att se vilka tecken som används för gruppseparatorn och decimaltecken:

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

Resultat:

,.

Här ser vi att decimaltecknet representeras av ett kommatecken, och gruppavgränsaren representeras av en punkt.

Du kan ändra värdet på NLS_NUMERIC_CHARACTERS parameter direkt om du vill (dvs. utan att ändra NLS_TERRITORY parameter).

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

Resultat:

12,345.00

Men du bör förmodligen undvika att göra detta, eftersom det orsakar en frånkoppling mellan NLS-parametrar. Dina NLS-parametrar återspeglar inte längre standardvärdena för det aktuella området. Om du inte har goda skäl att inte göra det, är det vanligtvis bättre att ändra NLS_TERRITORY parameter till det relevanta territoriet, så att andra parametrar också kan uppdateras till deras standard för det nya området.

'nlsparam' Argument

En sak jag bör nämna är att T0_CHAR() funktion accepterar ett tredje argument som gör att du tillfälligt kan ställa in olika NLS-parametrar, inklusive NLS_NUMERIC_CHARACTERS parameter. När du gör detta på funktionsnivå ändrar det inte värdet på dessa parametrar för den aktuella sessionen.

Här är ett exempel:

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;

Resultat:

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

Här ställde jag in sessionens territorium till Tyskland och anropade sedan TO_CHAR() tre gånger.

  • Det första anropet använder sessionens NLS-parametrar. Detta betyder att standardgruppavgränsaren är en punkt.
  • I det andra samtalet ställde jag uttryckligen in min egen NLS_NUMERIC_CHARACTERS parameter från funktionen. I det här fallet ställer jag in gruppseparatorn som ett kommatecken. Att göra detta påverkade inte min sessions NLS-parametrar, som framgår av det tredje samtalet.
  • Det tredje anropet använder sessionens NLS-parametrar, precis som det första anropet. Som vi kan se har gruppavgränsaren och decimaltecken inte påverkats av den (tillfälliga) förändringen som vi gjorde i vårt andra samtal.

Hårdkodad komma

Ett annat sätt att lägga till ett kommatecken till ett nummer är att hårdkoda det till din formatmodell.

Exempel:

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

Resultat:

12,345.00

I det här fallet hårdkodade jag kommatecken och punkten. Om du gör detta ignoreras gruppseparatorn som är inställd i NLS_NUMERIC_CHARACTERS parameter.

Flera komma

Du kan ha flera kommatecken och/eller gruppseparatorer inom en formatmodell.

Exempel:

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

Resultat:

123,456,789.00

Ogiltig kommaplacering

Ett kommatecken eller gruppavgränsare kan inte visas till höger om ett decimaltecken eller punkt i en nummerformatmodell.

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

Resultat:

Error report -
ORA-01481: invalid number format model

  1. Där villkor för sammanfogat bord i Sequelize ORM

  2. Återställ AutoIncrement i SQL Server efter borttagning

  3. Lägg till sökningssortering och sök med jquery datatable

  4. Introduktion till Amazon Web Services (AWS) automatisk skalning