Json值可能包含字符串值。例如:
postgres=# SELECT to_json('Some "text"'::TEXT);
to_json
-----------------
"Some \"text\""
如何将该字符串提取为postgres文本值?
::TEXT
无效。它返回引用的json,而不是原始字符串:
postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
to_json
-----------------
"Some \"text\""
感谢。
P.S。我正在使用PostgreSQL 9.3
答案 0 :(得分:101)
在9.4.4中使用#>>
运算符对我有用:
select to_json('test'::text) #>> '{}';
使用表格列:
select jsoncol #>> '{}' from mytable;
答案 1 :(得分:36)
PostgreSQL中没有办法解构标量JSON对象。因此,正如你所指出的那样,
select length(to_json('Some "text"'::TEXT) ::TEXT);
是15,
诀窍是将JSON转换为一个JSON元素的数组,然后使用->>
提取该元素。
select length( array_to_json(array[to_json('Some "text"'::TEXT)])->>0 );
将返回11。
答案 2 :(得分:1)
先生。好奇也对此感到好奇。除了#>> '{}'
运算符之外,在9.6+版本中,还可以使用->>
运算符获取jsonb字符串的值:
select to_jsonb('Some "text"'::TEXT)->>0;
?column?
-------------
Some "text"
(1 row)
如果具有json值,则解决方案是先将其转换为jsonb:
select to_json('Some "text"'::TEXT)::jsonb->>0;
?column?
-------------
Some "text"
(1 row)
答案 3 :(得分:1)
->>对我有用。
postgres版本:
<postgres.version>11.6</postgres.version>
查询:
select object_details->'valuationDate' as asofJson, object_details->>'valuationDate' as asofText from MyJsonbTable;
输出:
asofJson asofText
"2020-06-26" 2020-06-26
"2020-06-25" 2020-06-25
"2020-06-25" 2020-06-25
"2020-06-25" 2020-06-25
答案 4 :(得分:0)
一种简单的方法:
SELECT ('[' || to_json('Some "text"'::TEXT) || ']')::json ->> 0;
只需将json字符串转换为json列表
即可答案 5 :(得分:-2)
这个问题/解决方案产生了另一个问题...... PostgreSQL开发人员的清单:为什么需要将 JSON-string 转换为 SQL-text 引用?
哦,有一些dillema ......为什么不向用户询问他们喜欢什么?
在SQL中,转换 char(N)会生成没有引号的预期文本;在嵌入式语言或驱动程序中,转换SQL- text 会生成没有引号的预期字符串数据类型,而 string 会生成预期的SQL- 文本没有语录......这是普遍预期的行为......