arrays - 如何将 json 数组转换为文本数组?

标签 arrays json postgresql

此变通方法无效

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/

相关文章:

java - 根据数值对字符串数组进行排序

javascript - Backbone 集合 toJSON 返回集合对象

python - Flask-ReSTLess 从 Flask-Sqlalchemy 转储 Decimal 值

android - 构造函数 JSONArray(Object) 在 android 中未定义

database - "relation not found"在 Eclipse Hibernate 应用程序中使用 Postgres

C++ (gcc/g++) 两个巨大的字符串数组需要很长时间才能编译

php - 如何制作一个php数组

python - psycopg2 : cursor already closed

mysql - 创建具有特定键长度的索引的启发式方法?

c - 在结构数组内分配指针