Json值可以包含字符串值.例如.:
postgres=# SELECT to_json('Some "text"'::TEXT);
to_json
-----------------
"Some \"text\""
Run Code Online (Sandbox Code Playgroud)
如何将该字符串提取为postgres文本值?
::TEXT不起作用.它返回引用的json,而不是原始字符串:
postgres=# SELECT to_json('Some "text"'::TEXT)::TEXT;
to_json
-----------------
"Some \"text\""
Run Code Online (Sandbox Code Playgroud)
谢谢.
PS我正在使用PostgreSQL 9.3
我可以使用to_json(1)将int转换为json,但是如何将json转换为int?这可能太慢了:
to_json(1)::text::int
Run Code Online (Sandbox Code Playgroud)
另外,json是从二进制块(bson)还是简单的文本包装器中包装的?
我正在尝试以下查询:
SELECT (json_data->'position'->'lat') + 1.0 AS lat FROM updates LIMIT 5;
Run Code Online (Sandbox Code Playgroud)
(+ 1.0只是强制转换为浮点数.我的实际查询要复杂得多,这个查询只是问题的一个测试用例.)
我收到错误:
ERROR: operator does not exist: jsonb + numeric
Run Code Online (Sandbox Code Playgroud)
如果我添加显式转换:
SELECT (json_data->'position'->'lat')::float + 1.0 AS lat FROM updates LIMIT 5;
Run Code Online (Sandbox Code Playgroud)
错误变成:
ERROR: operator does not exist: jsonb + double precesion
Run Code Online (Sandbox Code Playgroud)
我知道大多数jsonb值都不能转换成浮点数,但在这种情况下我知道lats都是JSON数.
是否有一个函数将jsonb值转换为浮点数(或为uncastable返回NULL)?
在Postgres中将布尔字段从JSONB对象转换为普通bool类型的最佳方法是什么?
例如,我有一个JSON对象{"foo": true},我可以在Postgresql中使用它.例如:select ('{"foo": true}'::jsonb);它给了我一些类型JSONB.
现在我想将foo字段提取为布尔值.如果我做:
select ('{"foo": true}'::jsonb)->'foo';
Run Code Online (Sandbox Code Playgroud)
我得到了JSONB类型的东西.
但是,我无法将JSONB强制转换为布尔值.如果不是我做的:
select ('{"foo": true}'::jsonb)->>'foo';
Run Code Online (Sandbox Code Playgroud)
我会找回类型字符串的东西.从那我可以转换为布尔值.(例如:)
select (('{"foo": true}'::jsonb)->>'foo')::bool;
Run Code Online (Sandbox Code Playgroud)
但是从内部表示到字符串,然后再回到另一个内部表示,这似乎有点蠢.
有没有直接去布尔?
我目前最好的工作似乎是:
select (('{"foo": true}'::jsonb)->'foo') = 'true'::jsonb;
Run Code Online (Sandbox Code Playgroud)
但这似乎有点不对劲.
我觉得我必须在这里错过一些简单的东西,但是我已经查看了PostgreSQL关于JSON和JSON运算符和函数的文档,并没有看到任何解释它的东西.
在PostgreSQL中很容易将事物变成JSON:
SELECT *, pg_typeof(j) FROM (VALUES
(to_json(5)),
(to_json(true)),
(to_json('foo'::TEXT))
) x (j);
Run Code Online (Sandbox Code Playgroud)
会给我一个很好的jsons 结果集:
j | pg_typeof
-------+-----------
5 | json
true | json
"foo" | json
Run Code Online (Sandbox Code Playgroud)
但是,如何将这些json值转换回原始类型?当然,我不希望能够在一个结果集中完成所有操作,因为类型不一致.我只是个人意思.
铸造肯定不起作用:
SELECT to_json(5)::NUMERIC;
Run Code Online (Sandbox Code Playgroud)
给
ERROR: cannot cast type json to numeric
Run Code Online (Sandbox Code Playgroud)
如果我试图滥用这样的json_populate_record功能:
SELECT json_populate_record(null::INTEGER, to_json(5));
Run Code Online (Sandbox Code Playgroud)
我明白了
ERROR: first argument of json_populate_record must be a row type
Run Code Online (Sandbox Code Playgroud)
在PG 9.4中,我可以很容易地告诉类型:SELECT json_typeof(to_json(5));give number,但这并没有帮助我实际提取它.
也不json_to_record(也是9.4):
SELECT * FROM json_to_record(to_json(5)) x (i …Run Code Online (Sandbox Code Playgroud)