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を取得した理由です それらの値を比較するとき。