我在 Postgres 9.6 db 中有一个表,其结构如下:
Table "public.pricings"
Column | Type | Modifiers
---------------------------+-----------------------------+-------------------------------------------------------
id | integer | not null default nextval('pricings_id_seq'::regclass)
unconfirmed_matrix_prices | jsonb | not null default '"{}"'::jsonb
Run Code Online (Sandbox Code Playgroud)
我是使用 jsonb 的新手。
我想搜索任何空的 unconfirmed_matrix_prices(即默认值)。我看到我可以做这样的事情:
solar_dev=# select count(*) from json_object_keys('{"f1":1,"f2":2}');
count
-------
2
(1 row)
Run Code Online (Sandbox Code Playgroud)
有没有办法可以做一个 where 短语,其中 json_object_keys 等于 0?我知道一些变通的方法 - 有更好的方法吗?
我在 PostgreSQL 10 数据库product中有一个jsonb名为“元数据”的列的表。这是我第一次使用文档和 Postgres。jsonb值看起来像这样:
{
"name": "l33t 衬衫",
“价格”:“1200”,
"数量": "60",
“选项” :
{
“类型”:“收音机”,
"title": "颜色",
“选择”:[
{“价值”:“红色”,“价格”:“-100”,“数量”:“30”},
{“价值”:“蓝色”,“价格”:“+200”,“数量”:“10”},
{“价值”:“绿色”,“价格”:“+300”,“数量”:“20”}
]
}
}
两个问题:
1.如何选择“opts”数组中的特定元素?
select metadata->'options'->'opts'->(element here) from product
where metadata->'options'->'opts' @> '[{"value" : "blue"}]'
Run Code Online (Sandbox Code Playgroud)
2 、当售出一件或多件时,如何更新“数量”(减去当前的“数量”)?
对指南/注释的进一步链接表示赞赏。
我有一些使用该json_object()函数获得的嵌套 json 数据。现在我需要检查我在查询中使用的特定键是否存在某个值:-
select json_object(..) from tblxyz
where json_contains(columnname, '{"MyName" : "FirstName LastName"}')
Run Code Online (Sandbox Code Playgroud)
这种方法的问题是我需要整个字符串“FirstName LastName”才能在实际结果中找到这一行。现在我需要执行通配符搜索。那是:-
select json_object(..) from tblxyz
where json_contains(columnname, '{"MyName" : "FirstName"}')
Run Code Online (Sandbox Code Playgroud)
还应该在最终结果中将此条目返回给我。有人可以建议任何解决方法吗?
据我了解,如果您选择json_value或json_query指定 json 文档中不存在的键或对象,那么在严格模式下,您将收到错误。例如,这使您可以确认文档中是否指定了该密钥。
如果文档中包含示例键值对:
"Test":null
Run Code Online (Sandbox Code Playgroud)
...在严格模式下,这将返回“NULL”。换句话说,您现在知道该键已在文档中定义,并且其值为 null。
现在想象您的文档包含:
"Test":"Some string"
Run Code Online (Sandbox Code Playgroud)
而你查询:
select json_modify(@json, '$.Test', null);
Run Code Online (Sandbox Code Playgroud)
这将返回一个缺少“Test”键的 json 字符串。
如何正确地将键值设置为 null,而不是将其从 json 文档中删除?
(上面的示例可能看起来很荒谬,但我可以想象在将 json 文档传递到下一个查询或系统之前将值设置为 null,并要求文档中存在“Test”键。)
我想使用 Postgres(CloudSQL 中的 11)作为高效的键值存储。我有大约 200GB 的字典(平均大小为 10kB,结构可以不同并且可以嵌套)。我正在考虑利用改进的哈希索引。这是架构:
\n\n CREATE EXTENSION IF NOT EXISTS "uuid-ossp";\n\n CREATE TABLE IF NOT EXISTS key_val (\n id uuid DEFAULT uuid_generate_v4(),\n value jsonb,\n EXCLUDE using hash (id with =)\n );\n\n CREATE INDEX IF NOT EXISTS idx_key_val ON key_val USING hash (id);\nRun Code Online (Sandbox Code Playgroud)\n\n获取、更新和插入非常简单,但我不知道如何实现高效的更新插入。
\n\nINSERT INTO key_val VALUES ($1, $2) ON CONFLICT ON CONSTRAINT key_val_id_excl DO UPDATE SET value = ($2)\nRun Code Online (Sandbox Code Playgroud)\n\n结果是WrongObjectTypeError ON CONFLICT DO UPDATE not supported with exclusion constraints
可能的解决方案:
\n\n …在我们的数据库中,一个 JSONB 列包含一个对象,该对象具有一个属性,该属性是字符串编码的 JSON 对象。我需要在查询期间反序列化该字符串并检查其值。
create table datas (id int, data jsonb);
insert into datas (id, data) values (1, '{"key1": "{\"foo\": \"bar\"}"}');
Run Code Online (Sandbox Code Playgroud)
我可以选择字符串值,但将其转换为 JSONB 对象不起作用。这些查询都返回 null foo。
select data->'key1'->'foo' from datas;
select to_json(data->'key1')->'foo' from datas;
select (data->'key1')::jsonb->'foo' from datas;
Run Code Online (Sandbox Code Playgroud)
dbfiddle:https://dbfiddle.uk/? rdbms=postgres_9.6&fiddle=9c0a9f7f1323a35051daba5177e52f57
我试图将德语 \xc3\x9f 存储在 SQL Server 中,但结果是 \xc3\x83\xc5\xb8。\n例如“Gleimstra\xc3\x9fe”存储为“Gleimstra\xc3\x83\” xc5\xb8e"
\n但其他角色也会发生这种情况:
\n我查看了数据库排序规则,它显示SQL_Latin1_General_CP1_CI_AS。然后我用谷歌搜索并找到了这个。
但我不知道我现有的排序规则是否导致了问题,或者我需要做什么才能存储 \xc3\xb6、\xc3\x9f、\xc3\xa9、\xc3\xab、\ 等特殊字符xc3\xa7、\xc3\xb1、\xc3\xad。
\n更新1
\n事实上,我将字符串存储在一nvarchar列中。我通过 .NET 应用程序将数据发送到数据库。这是我在 web.config 中作为连接字符串的内容:
\n<add name="conn" connectionString="data source=(local)\\sql;Initial Catalog=mydb;User Id=myuser;Password=mypassword;" providerName="System.Data.SqlClient"/>
更新2
\n我从 JSON 文件中读取值,并将其传递给 a Newtonsoft.Json.Linq.JArray,然后将其传递给函数,如下所示:
InsertStreetId(item.SelectToken("location.street").Value(Of String))\n\n\n Public Shared Function InsertStreetId(ByVal street As String) As Integer\n Dim streetId As Integer\n\n Dim …Run Code Online (Sandbox Code Playgroud) 我有以下文件:
{
"name" : "student_1",
"courses" : [
{
"name" : "Algebra",
"grades" : [ 98, 96, 92 ]
},
{
"name" : "Computers",
"grades" : [ 80 ]
}
]
}
Run Code Online (Sandbox Code Playgroud)
如何更新指定课程的成绩?例如,我想将课程中Algebra的某些测试增加10 分。
我已经下载并安装了 SQL Server 2016 Community Technology Preview 2.3,如果我理解正确,它应该包含一个名为JSON_VALUE. (更新:CTP 2.4 已经发布,但也没有提到新的 JSON 功能)
从已经可以使用的 JSON 功能开始,... FOR JSON AUTO可以在我的SELECT语句中指定“ ” ,如下所示:
SELECT [ID], [DATA] FROM [dbo].[JSONDEMO] FOR JSON AUTO
Run Code Online (Sandbox Code Playgroud)
上面我的演示查询的结果将是一个包含一列的结果集,具有一些自动生成的名称,例如JSON_F123123123JSON 格式的值,例如:
[{"ID":"IDVALUE", "DATA":"{ {name:'ramsoft', id:1234}, ... }", ... }]
Run Code Online (Sandbox Code Playgroud)
到目前为止DATA一切顺利,但如果包含 JSON 数据,您将收到一个包含数据字符串文字的 JSON 文档,即使该字符串文字是有效的 JSON。你实际上可能想要的,或者我想要的,是:
[{"ID":"IDVALUE", "DATA":{ {name:'ramsoft', id:1234}, ... }, ... }]
Run Code Online (Sandbox Code Playgroud)
根据一些 MS 博客帖子,要将 JSON 值作为 JSON 值而不是作为VARCHAR(n)字符串获取,您应该编写:
SELECT [ID], JSON_VALUE(D.DATA,'$') DATA
FROM [dbo].[JSONDEMO] D FOR …Run Code Online (Sandbox Code Playgroud) 我正在学习 MongoDB 课程,其中一项作业要求在键周围包含引号。
所以我做了这样的查询 {$push: {"key":value}}
但有人告诉我 $push 也是一个键,因为它在左侧。我一直认为键就像值的标识符,而运算符只是操作,它们没有任何关联的值。