Nếu bạn muốn bỏ qua các hàng có JSON không hợp lệ, trước tiên bạn phải kiểm tra nếu văn bản là JSON hợp lệ. Bạn có thể làm điều này bằng cách tạo một hàm sẽ cố gắng phân tích cú pháp giá trị và bắt ngoại lệ cho các giá trị JSON không hợp lệ.
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;
Khi có điều đó, bạn có thể sử dụng is_json
hàm trong CASE
hoặc WHERE
để thu hẹp các giá trị hợp lệ.
-- 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;