Saltar al contenido

Cómo convertir vacío a null en PostgreSQL?

Contamos con tu apoyo para extender nuestras secciones con relación a las ciencias informáticas.

Solución:

Ahí está el NULLIF() función:

SELECT NULLIF(var, '');

Si var tiene el valor en $2, obtienes NULL en lugar de.
En el ejemplo reemplazo el vacío string: '' con NULL.

Hay sin vacío string para el tipo entero. Simplemente no es posible. Ya que NULLIF() no puede cambiar el tipo de datos, debe desinfectar su entrada en PHP.

Si no definió un valor predeterminado de columna, también puede solo omite la columna en el INSERT comando y se llenará con NULL (que es el predeterminado DEFAULT).

Compruebe si el parámetro está vacío en PHP y no incluya la columna en el INSERT comando si lo es.

O usa el PHP literal NULO en cambio, como demuestra Quassnoi aquí.

El resto solo tiene sentido para string tipos

Para estar absolutamente seguronadie puede entrar en un vacío string Agrega un CHECK restricción a la tabla:

ALTER TABLE tr_view
ADD CONSTRAINT tr_view_age_not_empty CHECK (age <> '');

Para evitar excepciones causado por esto, puede agregar un disparador que corrija la entrada automáticamente:

CREATE OR REPLACE FUNCTION trg_tr_view_avoid_empty()
  RETURNS trigger AS
$func$
BEGIN
   IF NEW.age = '' THEN
      NEW.age := NULL;
   END IF;

   IF NEW.month = '' THEN
      NEW.month := NULL;
   END IF;

   RETURN NEW;
END
$func$  LANGUAGE plpgsql

CREATE TRIGGER tr_view_avoid_empty
BEFORE INSERT OR UPDATE ON tr_view
FOR EACH ROW
WHEN (NEW.age = '' OR NEW.month = '')
EXECUTE PROCEDURE trg_tr_view_avoid_empty();

Mientras que la respuesta de Erwin sobre NULLIF es increíbleno aborda su error de sintaxis.

Echemos un vistazo a la consulta:

$query="Insert Into tr_view(name,age,month,year) values (toDB($name),toDB($age),toDB($month),toDB($year))

Anteriormente definiste una función llamada toDB. Lamentablemente, la sintaxis que está utilizando aquí es no cómo llamar a una función desde dentro de una comilla doble stringasí que los rizos y toDB( los bits todavía se están pasando. Hay dos alternativas:

  1. concatenación usando .:

    $query='insert Into tr_view(name,age,month,year) values (' . toDB($name) . ',' . toDB($age) . ',' . toDB($month) . ',' . toDB($year) . ')')
    
  2. Puede interpolar un invocable variable entre comillas dobles string así:

    $fn = 'toDB';
    $query="Insert Into tr_view(name,age,month,year) values ($fn($name),$fn($age),$fn($month),$fn($year))";
    

El primero es claro y cuerdo, el segundo es vago para lo desconocido y francamente loco.

Sin embargo, aún no debería ensamblar una entrada como esta. Todavía puede ser vulnerable a los ataques de inyección SQL. Debería usar declaraciones preparadas con marcadores de posición parametrizados.

La extensión de Postgres utiliza pg_prepare para esto. Tienen la clara ventaja de, por ejemplo, permitirle pasar un PHP null en vez de tener que preocuparte por todo eso null-detección y cotización.

Si insistes en mantener toDB como está, considere agregar uno de los pg_escape_ funciones, como pg_escape_stringa lo que construye cadenas entre comillas.

Recuerda algo, que te concedemos agregar una reseña .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *