我可以使用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)?
在下面的查询中,$ isComplete和$ isValid作为字符串返回.但是,它们保存为布尔值.如何获取要返回的这些字段的布尔表示?
query =
"SELECT
data #>> '{id}' AS id,
data #>> '{name}' AS name,
data #>> '{curator}' AS curator,
data #> '{$isValid}' as \"$isValid\",
data #> '{customer}' as customer,
data #> '{$createdTS}' as \"$createdTS\",
data #> '{$updatedTS}' as \"$updatedTS\",
data #> '{$isComplete}' as \"$isComplete\",
(count(keys))::numeric as \"numProducts\"
FROM
appointment_intakes,
LATERAL jsonb_object_keys(data #> '{products}') keys
GROUP BY id"
Run Code Online (Sandbox Code Playgroud) 我正在尝试在PostgreSQL 9.3中使用新的JSON功能,而我正在寻找一种能够使用JSON的功能,即to_json(anyelement)的对话.
以下是JSON示例:
{"single_comment": "Fred said \"Hi.\"" ,
"comments_array": ["Fred said \"Hi.\"", "Fred said \"Hi.\"", "Fred said \"Hi.\""]}
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT json_array_elements(json_column->'comments_array')
Run Code Online (Sandbox Code Playgroud)
返回文档中描述的SET OF JSON.
"Fred said \"Hi.\""
"Fred said \"Hi.\""
"Fred said \"Hi.\""
Run Code Online (Sandbox Code Playgroud)
有没有办法取消结果,所以我可以得到以下结果:
Fred said "Hi."
Fred said "Hi."
Fred said "Hi."
Run Code Online (Sandbox Code Playgroud)
在文档中,我没有看到任何可以帮助我的功能.不幸的是,对我来说,不能选择PLV8.
任何想法都受到高度赞赏.
我觉得我必须在这里错过一些简单的东西,但是我已经查看了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)
会给我一个很好的json
s 结果集:
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) 此解决方法不起作用
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!
Run Code Online (Sandbox Code Playgroud)
那么,如何获取文本的真实数组?
PS:使用所谓的“头等公民” JSONb,同样的问题。
编辑:@OtoShavadze好的答案(注释已解决!)之后,PostgreSQL开发人员的清单:为什么x::text
不进行强制转换?(使用第9.5.6页),为什么它不生成警告或错误?
假设我有一个类型的值json
,比方说y
.例如,可以通过obj->'key'
返回类型值的任何函数来获得这样的值json
.
当转换为此值时,该值text
包括引号,即 "y"
代替y
.在使用json
类型是不可避免的情况下,这会产生问题,特别是当我们希望将值与文字字符串进行比较时,例如
select foo(x)='bar';
Run Code Online (Sandbox Code Playgroud)
该API头脑风暴页面提示一个from_json
将智能解开JSON字符串的函数,但我怀疑这是尚未提供.与此同时,如何在没有引号的情况下将JSON字符串转换为文本?