sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo funciona la función to_number() en PostgreSQL

En PostgreSQL, puede usar to_number() función para convertir una cadena en un valor numérico.

Más específicamente, convierte la representación de cadena de un número en un valor numérico.

Por ejemplo, si tiene $1,234.50 como una cadena, puede usar to_number() para convertir eso en un número real que usa el numérico tipo de datos.

Sintaxis

La sintaxis es así:

to_number(text, text)

Donde el primer argumento es una representación de cadena del número y el segundo define la plantilla que usa el primer argumento.

Ejemplo

Aquí hay un ejemplo básico para demostrarlo.

SELECT to_number('80', '99');

Resultado:

80

En este caso, usé 99 como plantilla. Cada 9 se conoce como un "patrón de plantilla". El 9 patrón de plantilla representa una posición de dígito. Usé dos porque quería incluir ambos dígitos.

Esto es lo que sucede si elimino uno de los 9 s.

SELECT to_number('80', '9');

Resultado:

8

Por lo tanto, es importante incluir la cantidad correcta de patrones de plantilla en la plantilla.

Separador de grupos y punto decimal

Cuando trabaje con números más grandes y/o números con segundos fraccionarios, deberá incluir patrones de plantilla que especifiquen el separador de grupo y/o el punto decimal.

Hay dos formas de hacerlo.

La primera opción es escribir literalmente la coma y el punto decimal.

SELECT to_number('7,000.25', '9,999.99');

Resultado:

7000.25

La segunda opción es utilizar las versiones que reconocen la configuración regional. Estos son G para el separador de grupos (separador de miles) y D para el punto decimal.

Entonces, el ejemplo anterior podría reescribirse de la siguiente manera:

SELECT to_number('7,000.25', '9G999D99');

Resultado:

7000.25

Símbolo de moneda

El L el patrón de plantilla representa un símbolo de moneda compatible con la configuración regional.

SELECT to_number('$7,000.25', 'L9G999D99');

Resultado:

7000.25

Tipo de devolución

El valor de retorno de to_number() la funcion es numerica

Puede verificar el tipo de retorno con pg_typeof() función.

SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));

Resultado:

numeric

¿Resultados inesperados?

Es importante obtener la plantilla correcta. De lo contrario, podría terminar con resultados inesperados.

Aquí hay un ejemplo de lo que sucede si simplemente olvido incluir la L patrón de plantilla del ejemplo anterior.

SELECT to_number('$7,000.25', '9G999D99');

Resultado:

7000

Entonces, porque olvidé incluir la L patrón de plantilla (para la moneda), esto desincronizó toda la plantilla con el número, lo que resultó en la G siendo ignorado, así como la D .

Para que quede claro, aquí está de nuevo en comparación con la plantilla correcta.

SELECT 
  to_number('$7,000.25', 'L9G999D99') AS "Right",
  to_number('$7,000.25', '9G999D99') AS "Wrong";

Resultado:

   Right | Wrong
---------+-------
 7000.25 | 7000

to_number() frente a cast()

El to_number() La función se proporciona principalmente para manejar formatos de entrada que no se pueden convertir mediante una conversión simple. Por lo tanto, generalmente no es necesario para las representaciones numéricas estándar.

Entonces, el primer ejemplo en esta página podría haberse hecho usando cast() .

SELECT cast('80' AS NUMERIC);

Resultado:

80

Pero empezamos a tener problemas una vez que las cosas se vuelven un poco más complejas.

SELECT cast('$7,000.25' AS NUMERIC);

Resultado:

ERROR: invalid input syntax for type numeric: "$7,000.25"
LINE 1: SELECT cast('$7,000.25' AS NUMERIC);

Entonces to_number() fue diseñado principalmente para situaciones como esta.

Lista completa de patrones y modificadores de plantilla

Postgres incluye muchos más patrones y modificadores de plantillas.

Estos también se pueden usar al formatear valores numéricos (por ejemplo, al usar to_char() función para devolver una representación de cadena formateada del número).

Consulte Patrones y modificadores de plantilla para formato numérico en PostgreSQL para obtener una lista completa.