json_array_elements
の代わりにjson_array_elements_textを試してください 、テキストへの明示的なキャストは必要ありません(x::text
)、使用できるように:
CREATE or replace FUNCTION json_array_castext(json) RETURNS text[] AS $f$
SELECT array_agg(x) FROM json_array_elements_text($1) t(x);
$f$ LANGUAGE sql IMMUTABLE;
追加の質問について
x ::textがキャストではないのはなぜですか?
これはキャストされ、このためエラーは発生しませんが、json文字列を次のようなテキストにキャストする場合:::text
、postgresは値に引用符を追加します。
テストの目的で、関数を元の関数に再度変更して(質問にあるように)、次のことを試してみましょう。
SELECT
(json_array_castext('["hello","world"]'))[1] = 'hello',
(json_array_castext('["hello","world"]'))[1],
'hello'
ご覧のとおり、(json_array_castext('["hello","world"]'))[1]
"hello"
を与えます hello
の代わりに 。これがfalse
を取得した理由です それらの値を比較するとき。