PostgreSQL - USANDO VARCHAR PARA INSERTAR NUMEROS

 
Vista:
sin imagen de perfil
Val: 1
Ha disminuido su posición en 27 puestos en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

USANDO VARCHAR PARA INSERTAR NUMEROS

Publicado por Samir (1 intervención) el 23/06/2020 04:57:51
Hola, he creado la siguiente tabla en POSTGRESQL:

1
2
3
4
5
6
7
8
9
CREATE TABLE terceros(
	id_tercero smallserial,
	identificacion VARCHAR (20) NOT NULL,
	nombre VARCHAR (100) NOT NULL,
	direccion VARCHAR(100) NOT NULL,
	telefono VARCHAR (20) NOT NULL,
	CONSTRAINT pk_terceros PRIMARY KEY (id_tercero),
	CONSTRAINT uk_terceros UNIQUE (identificacion)
);

Según buenas practicas para los valores de IDENTIFICACION, como no se va a realizar ninguna operacion con dicho campo es recomendable crearlo de tipo VARCHAR. La inquietud es la siguiente desde el SQL, ¿Cómo valido que al momento de insertar datos para este campo solo tome los números y no letras?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Francisco
Val: 256
Oro
Ha mantenido su posición en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

USANDO VARCHAR PARA INSERTAR NUMEROS

Publicado por Francisco (110 intervenciones) el 26/06/2020 14:33:43
Hola

Solo debes aplicar un TRIGGER BEFORE INSERT antes de insertar y validar con la funcion ISNUMERIC si el valor contiene solo numeros o no

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* Funcion que valida que el texto contenga solo números */
DROP FUNCTION IF EXISTS ISNUMERIC;
CREATE OR REPLACE FUNCTION ISNUMERIC(valor text)
RETURNS BOOLEAN AS
$$
BEGIN
	IF valor IS NULL OR RTRIM(valor)='' THEN
    	RETURN false;
  	ELSE
    	RETURN (SELECT valor ~ '^ *[-+]?[0-9]*([.][0-9]+)?[0-9]*(([eE][-+]?)[0-9]+)? *$');
  	END IF;
END;
$$
LANGUAGE plpgsql;
 
/* Creamos la tabla prueba */
DROP TABLE IF EXISTS terceros;
CREATE TABLE terceros(
	id_tercero smallserial,
	identificacion VARCHAR (20) NOT NULL,
	nombre VARCHAR (100) NOT NULL,
	direccion VARCHAR(100) NOT NULL,
	telefono VARCHAR (20) NOT NULL,
	CONSTRAINT pk_terceros PRIMARY KEY (id_tercero),
	CONSTRAINT uk_terceros UNIQUE (identificacion)
);
 
/* La funcion o procedure que esta asociado al trigger */
DROP FUNCTION IF EXISTS is_valid_identification;
CREATE OR REPLACE FUNCTION is_valid_identification()
RETURNS TRIGGER AS
$$
BEGIN
	IF NOT ISNUMERIC(NEW.identificacion) THEN
		RAISE NOTICE 'Error => Rechazada la inserción del identificador %. El identificador solo puede contener numeros.', NEW.identificacion;
		RETURN NULL;
	END IF;
	RETURN NEW;
END;
$$
LANGUAGE plpgsql;
 
/* Creamos el trigger que va a validar la inserción */
DROP TRIGGER IF EXISTS trigger_terceros_valid_identification ON terceros;
CREATE TRIGGER trigger_terceros_valid_identification
BEFORE INSERT
ON terceros
FOR EACH ROW
EXECUTE PROCEDURE is_valid_identification()
;
 
/* Realizamos Inserciones */
INSERT INTO terceros VALUES(1,'H00012','Maria','Direccion1', 'Telefono1');
INSERT INTO terceros VALUES(2,'H00J12','José','Direccion2', 'Telefono2');
INSERT INTO terceros VALUES(3,'123123','Juan','Direccion3', 'Telefono3');
INSERT INTO terceros VALUES(4,'345345','Pedro','Direccion4', 'Telefono4');
 
/* Solo debe estar Juan y Pedro */
SELECT * FROM terceros;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar