JSONを含み、テキストも計画するテキスト列があります。 JSONに変換してから、特定のプロパティを選択します。例えば:
user_data
_________
{"user": {"name": "jim"}}
{"user": {"name": "sally"}}
some random data string
私はもう試した:
select user_data::json#>'{user,name}' from users
私は得る:
ERROR: invalid input syntax for type json
DETAIL: Token "some" is invalid.
CONTEXT: JSON user_data, line 1: some...
これを防ぐことは可能ですか?
無効なJSONの行をスキップする場合は、最初にtestテキストが有効なJSONである必要があります。これを行うには、値を解析し、無効な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;
その場合、CASE
句またはWHERE
句でis_json
関数を使用して、有効な値を絞り込むことができます。
-- 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;
この機能を使用します。
create or replace function is_json(text)
returns boolean language plpgsql immutable as $$
begin
perform $1::json;
return true;
exception
when invalid_text_representation then
return false;
end $$;
テスト:
with users(user_data) as (
values
('{"user": {"name": "jim"}}'),
('not json'),
('{"user": {"name": "sally"}}'),
('also not json')
)
select user_data::json#>'{user,name}' as name
from users
where is_json(user_data);
name
---------
"jim"
"sally"
(2 rows)