Jeśli chcesz pominąć wiersze z nieprawidłowym kodem JSON, musisz najpierw przetestować czy tekst jest poprawnym JSON. Możesz to zrobić, tworząc funkcję, która spróbuje przeanalizować wartość i złapać wyjątek dla nieprawidłowych wartości JSON.
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;
Kiedy już to masz, możesz użyć is_json
funkcja w CASE
lub WHERE
klauzula, aby zawęzić prawidłowe wartości.
-- 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;