Eligiendo el tipo de dato numérico que se usará en una columna

13 comentarios

Cuando defines que los datos que se guardarán en una columna serán de tipo numérico debes decidir también cual de los tipos numéricos que posee el Firebird emplearás. Estas son tus opciones:

  • SMALLINT
  • INTEGER
  • BIGINT
  • NUMERIC
  • DECIMAL
  • FLOAT
  • DOUBLE PRECISION

Como ves, tienes 7 posibilidades, cada una de ellas será la más apropiada para alguna circunstancia, así que ahora debes decidirte por una de esas 7 alternativas.

¿Necesitas guardar números exactos o números aproximados?

A veces, el número que guardas en un columna debe ser exacto, no se admite por ningún motivo que sea aproximado. Ese es el caso del dinero. Allí, tendrás que saber hasta el último centavo cuanto dinero te debe un cliente. O cuanto dinero le cobraste a ese cliente. No puedes responder con algo como: “aproximadamente 100 dólares”, sino que debes responder con el monto exacto.

Otras veces, un número aproximado es apropiado, por ejemplo: ¿cuánto pesó la última bolsa de harina que se puso en la balanza? si respondes con: 52 kilogramos y 245 gramos estará ok, si no eran 245 gramos sino 246 gramos ó 247 gramos no hay problema. Lo mismo que si en lugar de ser 245 gramos eran en realidad 245,1304 gramos. No hay problema.

Necesitarás guardar valores exactos cuando estés tratando con cantidades (dinero, unidades, cajas, precios, etc.) o sea algo que se puede contar y podrás usar valores aproximados cuando puedas medirlo (longitud, volumen, peso, presión, voltaje, etc.)

¿Puedes contarlo? entonces necesitarás números exactos

¿Puedes medirlo? entonces podrás usar números aproximados

¿Cuáles son los tipos de datos numéricos exactos?

  • SMALLINT
  • INTEGER
  • BIGINT
  • NUMERIC
  • DECIMAL

Estos tipos de datos pueden guardar números enteros y también números con decimales. La precisión (representada con la letra “p”) es la cantidad de dígitos significativos. La escala (representada con la letra “s”) es la cantidad de dígitos que se encuentran a la derecha de la coma decimal.

Por ejemplo: DECIMAL(8, 3) significa ppppp.sss

Aquí, hay 8 dígitos en total y como 3 de ellos corresponden a la parte decimal eso implica que hay 5 en la parte entera.

¿Cuáles son los tipos de datos numéricos aproximados?

  • FLOAT
  • DOUBLE PRECISION

Estos tipos de datos guardan números decimales y números con exponentes.

Los últimos decimales de estos números pueden variar cuando se hacen operaciones matemáticas, por eso nunca se los debe usar para guardar en ellos cantidades que deben ser exactas.

Rangos de valores

TIPO DE DATOS       DESDE              HASTA                 .
SMALLINT            -32768             32767 
INTEGER             -2147483648        2147483647 
BIGINT              -2 * 10 ^ 63       2 * 10 ^ 63 - 1 
NUMERIC             -2 * 10 ^ 63       2 * 10 ^ 63 - 1 
DECIMAL             -2 * 10 ^ 63       2 * 10 ^ 63 - 1 
FLOAT               1,175 * 10 ^ -38   3,402 * 10 ^ 38 
DOUBLE PRECISION    2,225 * 10 ^ -308  1,797 * 10 ^ 308

Ejemplo que muestra el error de precisión cuando se usa FLOAT

Este ejemplo nos mostrará por qué no debemos guardar valores que deben ser exactos en una columna de tipo FLOAT

UPDATE
   PRODUCTOS
SET
   PRD_PREVTA = 1.23456
WHERE
   PRD_IDENTI = 215

Este comando UPDATE guarda el número 1.23456 en la columna PRD_PREVTA (precio de venta) de la tabla PRODUCTOS para el producto cuyo identificador es 215.

Ahora, queremos ver el precio de venta que guardamos con el comando UPDATE. Deberíamos ver 1.23456 ¿será eso lo que veremos?

SELECT
   PRD_PREVTA
FROM
   PRODUCTOS
WHERE
   PRD_IDENTI = 215

La imagen de abajo es lo que obtenemos al ejecutar este SELECT.

PREVTA

(haciendo click en la imagen la verás más grande)

Pues no, no obtuvimos 1.23456 sino un número un poco mayor, un número diferente.

Mucho cuidado con esto, cuando se trata de dinero esta clase de errores son totalmente inaceptables.

Artículo relacionado:

https://firebird21.wordpress.com/2013/03/04/entendiendo-numeric-y-decimal/

Ejemplo Nº 007 – Encontrando las filas de una tabla que no existen en otra tabla

1 comentario

A veces nos interesa responder preguntas como: ¿cuáles son los alumnos que no rindieron el examen de Matemática? ¿quiénes son los clientes a los cuales aún no se les cobró? ¿cuáles son los productos que no tenemos en la sucursal de Roma? ¿quiénes son las personas que aún no votaron?

Todas estas preguntas como puedes ver son negativas, en todas ellas queremos saber cuales son las filas que no cumplen con una condición.

La forma de responderlas es a través de un JOIN y de un WHERE en el cual la condición sea IS NULL, como en este ejemplo:

Ejemplo. ¿Cuáles son los clientes a quiénes aún no se les cobró?

SELECT
   C.CLI_CODIGO,
   C.CLI_NOMBRE
FROM
   CLIENTES C
LEFT JOIN
   COBRANZAS B
      ON C.CLI_CODIGO = B.COB_CODCLI
WHERE
   B.COB_CODCLI IS NULL

Al ejecutarlo obtendremos los códigos y los nombres de todos los clientes a quienes aún no se les ha cobrado. ¿Por qué? porque si no se les cobró entonces el código de ellos no estará en la tabla de COBRANZAS y si el código no está en esa tabla entonces la condición B.COB_CODCLI IS NULL será verdadera, ya que si buscamos en una tabla un dato que no se encuentra en esa tabla lo que obtenemos es NULL.

En lenguaje llano lo que estamos diciendo es: “muéstrame los códigos y los nombres de todos los clientes cuyos códigos no se encuentren en la tabla de COBRANZAS”. Y claro, si los códigos no están en esa tabla es porque no se les cobró.

Lo importante a recordar es que cuando deseamos responder preguntas negativas tales como las planteadas al principio de este artículo debemos en el WHERE utilizar IS NULL.