PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment empêcher la "syntaxe d'entrée non valide pour le type json" dans Postgres, lorsque les enregistrements contiennent un mélange de json ou de chaînes

Si vous souhaitez ignorer les lignes avec JSON invalide, vous devez d'abord tester si le texte est valide JSON. Vous pouvez le faire en créant une fonction qui tentera d'analyser la valeur et interceptera l'exception pour les valeurs JSON non valides.

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;

Lorsque vous avez cela, vous pouvez utiliser le is_json fonction dans un CASE ou WHERE clause pour restreindre les valeurs valides.

-- 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;