如何将Postgres中的JSON转换为整数

67

我可以使用to_json(1)将整数转换为JSON,但是如何将JSON转换为整数?这可能会太慢:

to_json(1)::text::int

另外,json是由二进制块(bson)包装还是简单的文本包装?


100::text::jsonb - Time Killer
3个回答

82

对我有效的方法(使用postgresql 5.6)是:

SELECT (tablename.jsoncolumnname->>'jsonfiledname')::int FROM tablename;

喜欢

SELECT (users.data->>'failed_login_attempts_count')::int FROM users;

假设 users 表中有一个名为 data 的 json 列,其内容类似于:

{"failed_login_attempts_count":"2","comment":"VIP"}

2
SELECT (*)::int - 这就是我想要的!谢谢。 - Junaid Atari
1
(ta.args ->> 'deposit')::bigint seemed like it was going to work, but I got ERROR: value "1830000000000000000000" is out of range for type bigint - Ryan
Ryan,这些答案肯定会对你有所帮助。问题在于,你不能将那个大数存储为整数,因为使用整数作为数据类型时会缺乏效率。 https://dev59.com/J2w05IYBdhLWcg3wmC-_ - Mochi

20

to_json(1)::text::int可能太慢了

但是这是唯一的方法。

你提问的第二部分不太清楚。


8

PostgreSQL 9.3的JSON支持只是验证JSON文本。

在9.4及更高版本中,您可以使用jsonb。

“可能太慢”并没有太多意义。您为什么认为它太慢?您进行过测试和基准测试吗?如果它“太慢”,那么什么速度不会太慢,即您期望的速度是多少?


谢谢,希望新版本能够尽快发布。 由于字符串和数字之间存在转换,所以它肯定比直接使用整数类型慢,这是众所周知的。虽然在实际情况下可以接受,但我们正在寻找更快的方法。 我将这个问题放在了json-to-int问题下面,因为我怀疑json是从文本中包装而来的,这使得json-to-int必须从文本中转换,否则,它的存储结构应该已经被类型化了。 - Inshua
现在已经存在 jsonb。它是否支持直接从 json 中提取整数? - Tom Ellis
@Craig Ringer - 如果值为 null,则存在问题:选择 ('[null]'::json->0)::text::int 会引发无效的输入语法错误,即 "null",这是有道理的...这个有效:选择 ('[null]'::json->>0)::int... 返回 null - Reinsbrain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接