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

Cómo evitar la 'sintaxis de entrada no válida para el tipo json' en Postgres, cuando los registros contienen una combinación de json o cadenas

Si desea omitir las filas con JSON no válido, primero debe probar si el texto es JSON válido. Puede hacerlo creando una función que intentará analizar el valor y detectar la excepción de valores JSON no válidos.

CREATE OR REPLACE FUNCTION is_json(input_text varchar) RETURNS boolean AS $$
  DECLARE
    maybe_json json;
  BEGIN
    BEGIN
      maybe_json := input_text;
    EXCEPTION WHEN others THEN
      RETURN FALSE;
    END;

    RETURN TRUE;
  END;
$$ LANGUAGE plpgsql IMMUTABLE;

Cuando tenga eso, podría usar is_json función en un CASE o WHERE cláusula para limitar los valores válidos.

-- this can eliminate invalid values
SELECT user_data::json #> '{user,name}'
FROM users WHERE is_json(user_data);

-- or this if you want to fill will NULLs
SELECT
  CASE
    WHEN is_json(user_data)
      THEN user_data::json #> '{user,name}'
    ELSE
      NULL
  END
FROM users;