我正在尝试以下查询:
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)?
升级到PostgreSQL 9.4之后,如何将所有JSON列转换为JSONB列?
我不介意丢失任何重复的密钥和空白.
我正在运行最新版本的PostgreSQL 9.4.5-1.pgdg14.04+1,并尝试使用PostgreSQL 9.4文档中JSON_ARRAY_LENGTH描述的函数计算JSONB数组的长度
这是我试图运行的确切查询:
SELECT JSON_ARRAY_LENGTH('["hi","ho"]'::jsonb) AS length
Run Code Online (Sandbox Code Playgroud)
当我运行该查询时,我希望返回一个值2,但是遇到错误:ERROR: function json_array_length(jsonb) does not exist
我错过了文档中非常明显的内容吗?它特别声明您可以调用JSON_ARRAY_LENGTH传递json或jsonb数据类型.我明确地施展,jsonb所以我有点不知所措.
有没有其他人遇到过这个问题,或者有人会指出我在这里做错了什么?
更新:我误读了文档
我本来应该打电话JSONB_ARRAY_LENGTH,而不是JSON_ARRAY_LENGTH.注意"JSON"之后的"B".多谢你们.
我使用这个在PostgreSQL中创建了一个表:
CREATE TEMP TABLE jsontesting
AS
SELECT id, jsondata::jsonb FROM ( VALUES
(1, '["abra","value","mango", "apple", "sample"]'),
(2, '["japan","china","india", "russia", "australia"]'),
(3, '["must", "match"]'),
(4, '["abra","value","true", "apple", "sample"]'),
(5, '["abra","false","mango", "apple", "sample"]'),
(6, '["string","value","mango", "apple", "sample"]'),
(7, '["must", "watch"]')
) AS t(id,jsondata);
Run Code Online (Sandbox Code Playgroud)
现在我想要的是
添加像append_to_json_array这样的东西,实际的jsondata是一个json数组,而newString是我必须添加到jsondata数组的,这个函数应该返回更新的json数组.
UPDATE jsontesting
SET jsondata=append_to_json_array(jsondata, 'newString')
WHERE id = 7;
Run Code Online (Sandbox Code Playgroud)从json数据数组中删除一个值,一个用于删除值的函数.
我试图搜索PostgreSQL的文档,但没有发现任何内容.
在完成关系DB/NoSQL研究辩论之后,我得出的结论是,我将继续将PG作为我的数据存储.该决定的一个重要部分是宣布JSONB达到9.4.我的问题是我现在应该怎么做,从头开始构建一个应用程序,知道我想要迁移到(我的意思是现在使用!)jsonb?对我来说,DaaS选项将会运行9.3.
从我所知道的,并纠正我,如果我错了,hstore会运行得更快,因为我将在hstore列中对许多键进行大量查询,如果我要使用普通的json我就不会能够利用索引/ GIN等.但是我可以利用json嵌套,但运行任何查询都会非常慢,用户会感到沮丧.
那么,我是否围绕当前版本的hstore或json数据类型,"good ol"EAV或其他东西构建我的应用程序?我应该以某种方式构建我的数据库和应用程序代码吗?任何建议将不胜感激.我相信其他人可能会面临同样的问题,因为我们等待PostgreSQL的下一次正式发布.
关于我想要构建的应用程序的一些额外细节:
- 非常关系(下面有一个例外) -
强大的社交网络方面(群组,朋友,喜欢,时间轴等) -
基于具有可变用户分配属性的单个对象,可能是10或1000+(这是无模式设计的地方)需要发挥作用)
提前感谢任何输入!
Django 强烈建议 不要使用null=TrueCharField和TextField基于字符串的字段,以便不为"无数据"提供两个可能的值(假设您允许使用空字符串blank=True).这对我来说很有意义,我在所有项目中都这样做.
Django 1.9引入了JSONField,它使用底层的Postgres jsonb数据类型.上面的建议是否会延续到JSONField(即blank=True应该用于代替null=True)?或者,应该null=True使用?或者,应该default=dict使用?要么, ..?为什么?
换句话说,当您只想允许一个"无数据"值时,新的本机JSONField的约定是什么?请支持你的答案,因为我做了很多研究,找不到任何正式的.提前致谢.
在postgresql 9.5中,有没有办法在jsonb字段中重命名属性?
例如:
{ "nme" : "test" }
Run Code Online (Sandbox Code Playgroud)
应该重命名为
{ "name" : "test"}
Run Code Online (Sandbox Code Playgroud) 当我尝试从表中选择一些记录时
SELECT * FROM movie_test WHERE tags = ('["dramatic","women", "political"]'::json)
Run Code Online (Sandbox Code Playgroud)
sql代码抛出错误
LINE 1: SELECT * FROM movie_test WHERE tags = ('["dramatic","women",...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
********** ?? **********
ERROR: operator does not exist: json = json
SQL ??: 42883
????:No operator matches the given name and argument type(s). You might need to add explicit type casts.
??:37
Run Code Online (Sandbox Code Playgroud)
我错过了什么或者我可以在哪里了解这个错误.
我有"组织"模型,它存储与组织相关的所有信息.有一个名为"集成"的JSONB类型的字段,用于存储与组织具有的所有外部服务集成有关的信息.
如何使用存储访问器访问存储在嵌套JSON中的信息,例如:
{
"mailchimp": {"api_key":"vsvsvef", "list_id":"12345"},
"sendgrid" : {"username":"msdvsv", "password":"123456"}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用这样的商店访问器访问mailchimp:
store_accessor :integrations, :mailchimp
Run Code Online (Sandbox Code Playgroud)
如何轻松访问mailchimp的api_key?
我正在使用Rails 4.2和Postgres 9.4来尝试新的JSONB数据类型.我的数据库中的一个JSONB列包含一个数组,我希望能够查询此数组包含特定值的记录.我想出了如何使用新的JSONB"问号"("包含")运算符来完成此操作,如下所示:http: //www.postgresql.org/docs/9.4/static/functions-json.html
所以在原始SQL中我可以像在这个例子中那样工作:
SELECT * FROM people WHERE roles ? '32486d83-4a38-42ba-afdb-f77ca40ea1fc';
Run Code Online (Sandbox Code Playgroud)
但我无法通过ActiveRecord看到从Rails中进行此查询的任何方法.我尝试使用"where"方法进行原始查询,如下所示:
Person.where("roles ? ?", "32486d83-4a38-42ba-afdb-f77ca40ea1fc")
Run Code Online (Sandbox Code Playgroud)
但由于问号是用于替换参数的特殊字符,我收到此错误:
ActiveRecord :: PreparedStatementInvalid:在:roles中错误的绑定变量数(1为2)??
我想我需要一种方法来逃避"?" 因为我希望它从字面上传递出来.我试过了 \?和?? 没有运气.任何帮助表示赞赏!
jsonb ×10
postgresql ×9
json ×5
activerecord ×2
sql ×2
array-push ×1
arrays ×1
casting ×1
django ×1
hstore ×1
python ×1