sql >> Base de Datos >  >> RDS >> Oracle

Cómo dar formato a un número con una coma en Oracle

Cuando usas el TO_CHAR() para dar formato a un número en Oracle, utilice un modelo de formato para determinar cómo debe formatearse el número.

Por ejemplo, podría formatear un número como 12,345.00 o como 12.345,00 , según su configuración regional.

El modelo de formato puede incluir la G o D elementos de formato para agregar una coma a un número. El que uses depende de si quieres la coma como separador de miles o como un carácter decimal.

Alternativamente, puede usar un carácter de coma real (, ) si lo prefiere, aunque este método no tiene en cuenta la configuración regional como G y D los elementos de formato son.

El G y D Elementos de formato

Aquí hay un ejemplo para demostrar la G y D elementos de formato:

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

Resultado:

12,345.00

En este caso, el separador de grupos genera una coma y el carácter decimal genera un punto. Eso es porque mi sesión actual NLS_TERRITORY el parámetro está establecido en Australia .

Esto es lo que sucede si cambio mi NLS_TERRITORY parámetro a Germany :

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

Resultado:

12,345.00

Ahora se usa la coma para el carácter decimal.

Como explicación rápida del modelo de formato anterior:

  • La fm El modificador de formato suprime cualquier relleno que pueda aplicarse al resultado.
  • El 9 los caracteres representan números.
  • El 0 el carácter representa números sin suprimir ningún cero inicial o final.

Aquí hay una lista completa de elementos de formato de número que puede usar como referencia rápida.

Tél NLS_NUMERIC_CHARACTERS Parámetro

Cuando configuramos el NLS_TERRITORY (como en el ejemplo anterior), esto establece implícitamente un montón de otros parámetros, incluido el NLS_NUMERIC_CHARACTERS parámetro.

Tél NLS_NUMERIC_CHARACTERS El parámetro determina qué caracteres se utilizan para el separador de grupo y el carácter decimal.

Podemos consultar el V$NLS_PARAMETERS ver para ver qué caracteres se utilizan para el separador de grupo y el carácter decimal:

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

Resultado:

,.

Aquí vemos que el carácter decimal está representado por una coma, y ​​el separador de grupo está representado por un punto.

Puede cambiar el valor de NLS_NUMERIC_CHARACTERS parámetro directamente si lo desea (es decir, sin cambiar el NLS_TERRITORY parámetro).

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

Resultado:

12,345.00

Pero probablemente debería evitar hacer esto, porque provoca una desconexión entre los parámetros NLS. Sus parámetros NLS ya no reflejan los valores predeterminados para el territorio actual. A menos que tenga una buena razón para no hacerlo, generalmente es mejor cambiar el NLS_TERRITORY parámetro al territorio relevante, de modo que otros parámetros también se puedan actualizar a su valor predeterminado para el nuevo territorio.

El 'nlsparam' Argumento

Una cosa que debo mencionar es que el T0_CHAR() La función acepta un tercer argumento que le permite establecer temporalmente varios parámetros NLS, incluido el NLS_NUMERIC_CHARACTERS parámetro. Cuando hace esto en el nivel de función, no cambia el valor de esos parámetros para la sesión actual.

He aquí un ejemplo:

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;

Resultado:

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

Aquí, establecí el territorio de la sesión en Alemania y luego llamé a TO_CHAR() tres veces.

  • La primera llamada usa los parámetros NLS de la sesión. Esto significa que el separador de grupo predeterminado es un punto.
  • En la segunda llamada, configuro explícitamente mis propios NLS_NUMERIC_CHARACTERS parámetro desde dentro de la función. En este caso, configuré el separador de grupo como una coma. Hacer esto no afectó los parámetros NLS de mi sesión, como se vio en la tercera llamada.
  • La tercera llamada usa los parámetros NLS de la sesión, al igual que la primera llamada. Como podemos ver, el separador de grupos y el carácter decimal no se han visto afectados por el cambio (temporal) que hicimos en nuestra segunda llamada.

Coma codificada

Otra forma de agregar una coma a un número es codificarlo en su modelo de formato.

Ejemplo:

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

Resultado:

12,345.00

En este caso codifiqué la coma y el punto. Hacer esto ignora el separador de grupo establecido en NLS_NUMERIC_CHARACTERS parámetro.

Múltiples comas

Puede tener múltiples comas y/o separadores de grupo dentro de un modelo de formato.

Ejemplo:

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

Resultado:

123,456,789.00

Colocación de coma no válida

Una coma o separador de grupo no puede aparecer a la derecha de un carácter decimal o punto en un modelo de formato de número.

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

Resultado:

Error report -
ORA-01481: invalid number format model