此变通方法无效
CREATE FUNCTION json_array_castext(json) RETURNS text[] AS $f$
SELECT array_agg(x::text) FROM json_array_elements($1) t(x);
$f$ LANGUAGE sql IMMUTABLE;
-- Problem:
SELECT 'hello'='hello'; -- true...
SELECT (json_array_castext('["hello","world"]'))[1] = 'hello'; -- false!
那么,如何获取真正的文本数组呢?
PS:与所谓的“一等公民”JSONb,同样的问题。
编辑:在@OtoShavadze 好的回答(评论已解决!)之后,PostgreSQL 开发人员的 list :为什么 x::text
不是类型转换? (使用 pg 9.5.6)以及为什么它不生成警告或错误?
最佳答案
尝试 json_array_elements_text 而不是 json_array_elements
,并且您不需要显式转换为文本 (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;
关于你的附加问题
Why x::text is not a cast?
这是强制转换的,因此,它不会给出任何错误,但是当将 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
的原因。
关于arrays - 如何将 json 数组转换为文本数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45243186/