PDA

Ver la Versión Completa : Identificar el tipo de dato


kayetano
28-07-2004, 14:07:08
Hola

Tengo que realizar unos cambios en una programación pero no puedo tocar la estructura de la base de datos.

Os pongo en situación:
En una sección del programa se pueden realizar consultas sobre todos los artículos seleccionando unas características (en un desplegable) y el posible valor de esa característica ( en otro desplegable ).
Un valor de una característica puede ser cualquier cosa, texto, numeros o lo que se le ocurra ya que se guarda en un tipo varchar.
Ahora me piden que si los valores de la característica son números (aunque almacenados en un campo varchar) en vez de mostrar el desplegable "VALOR" muestre dos desplegables "DESDE" y "HASTA".

Mi problema esta en como detectar si un dato guardado en un varchar es numérico y si el todos los valores de esta característica son numericos.

Estoy haciendo algunas pruebas del siguiente modo:

SELECT valor, if( 0+valor, 0+valor, NULL ) AS valorNum
FROM car_art
WHERE ...

con esto obtengo el valor como cadena y el valor como número, pero con el siguiente comportamiento:
- si valor es 0, valorNum es NULL.
- si valor es un numero mayor de 0, valorNum es un número ( ej. "10" ).
- si valor es una cadena iniciada por un numero, valorNum es númerico (ej. "10 cm" ).
- si valor es una cadena iniciada por espacios y numeros, valorNum es un número (ej. " 10 cm" ).
- si valor es una cadena de texto iniciada por letras, valorNum es NULL.

Todas esta pruebas me habían animado mucho hasta que detecte valores del tipo "100x50" con lo que valorNum es 100.

Por lo tanto estoy a punto de descartar esta opción, y os pido vuestra colavoración para que propongáis sistemas alternativos para detectar si un dato guardado en un varcha es numérico o no.
Estoy pensando en añadir algun tipo de marca al inicio del valor tipo "#" o algo por el estilo, pero espero vuestras sugerencias para continuar.

Gracias a todos.

roman
28-07-2004, 19:43:54
Una opción sería leer el valor a una variable en Delphi y usar funciones como Val para determinar si es o no un número.

Si requieres hacerlo en la misma consulta podrías intentar algo como:


select
valor,
if(concat(valor+0, "") = valor, valor, null) as valorNum
from car_art


es decir, conviertes valor a número y de vuelta a cadena y checas si coincide con el original, en cuyo caso significa que es un número.

Aunque así, valores como 10cm los pone como NULL y no me queda claro si tales valores los quieres identificar como numéricos o no.

// Saludos