PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como evitar 'sintaxe de entrada inválida para o tipo json' no Postgres, quando os registros contêm uma mistura de json ou strings


Se você quiser pular as linhas com JSON inválido, você deve primeiro testar se o texto for JSON válido. Você pode fazer isso criando uma função que tentará analisar o valor e capturar a exceção para valores JSON invá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;

Quando você tem isso, você pode usar o is_json função em um CASE ou WHERE cláusula para restringir os 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;