我使用的是 PG 9.5,我有一个表 Visitor(id, data::json)
例子:
Visitor(id: 1, data: {name: 'Jack', age: 33, is_user: true })
Run Code Online (Sandbox Code Playgroud)
我想执行类似的查询
数据列内的键是用户指定的,因此是动态的。
在这种情况下哪个索引最有意义?
我正在测试 MySQLJSON_ARRAY和JSON_ARRAYAGG函数,以便将一些应用程序昂贵的进程移动到 SQL 存储函数。
在下面的电子商务应用程序示例中,我尝试检索用户的购物车,而不是作为来自 cart_items 表的行结果集,而是作为包含 Javascript 回调函数呈现购物车所需的所有信息的 JSON 字符串。
我有一张cart包含一般购物车信息的表格
create table user_cart (
cart_id integer unsigned primary key,
user_id integer unsigned not null,
);
Run Code Online (Sandbox Code Playgroud)
和cart_item明细表,
create table cart_item (
cart_item_id integer unsigned primary key auto_increment,
cart_id integer unsigned not null,
product_id integer unsigned not null,
qty integer unsigned not null,
ref varchar(15) not null,
-- total
base double default 0.0,
tax double default 0.0,
tax_pct double default 0.0,
total …Run Code Online (Sandbox Code Playgroud) 当表具有 json 或 jsonb 列时,是否无法在 INSERT/UPDATE 触发器中进行全行比较?我收到的错误让我认为我需要单独比较每一列,因为该NEW.*/OLD.*格式不能用于比较 json 列。
CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
NEW.modified_at = now();
RETURN NEW;
ELSE
RETURN OLD;
END IF;
END;
$$ language 'plpgsql';
CREATE TRIGGER mytable_insert_update
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE on_insert_update_modified();
Run Code Online (Sandbox Code Playgroud)
当我插入包含 json 和 jsonb 列的表时,出现以下错误:
CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
NEW.modified_at …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个查询,该查询会生成一个由 SQL Server 生成的 JSON 对象。我发现我可以使用子查询用包含问题列表的 JSON 字符串填充字段(在本例中为问题字段)。
下面是查询:
SELECT
quizzes.id AS 'id',
quizzes.name AS 'name',
quizzes.description AS 'description',
quizzes.instructions AS 'instructions',
author.id AS 'author.id',
author.midas AS 'author.midas',
author.first_name AS 'author.first_name',
author.last_name AS 'author.last_name',
author.email AS 'author.email',
author.tel AS 'author.tel',
author.department_name AS 'author.department_name',
author.created_at AS 'author.created_at',
author.last_updated AS 'author.last_updated',
course.id AS 'course.id',
course.name AS 'course.name',
course.description AS 'course.description',
course.crn AS 'course.crn',
instructor.id AS 'course.instructor.id',
instructor.midas AS 'course.instructor.midas',
instructor.first_name AS 'course.instructor.first_name',
instructor.last_name AS 'course.instructor.last_name',
instructor.email AS 'course.instructor.email',
instructor.tel AS 'course.instructor.tel',
instructor.department_name …Run Code Online (Sandbox Code Playgroud) 我在“资产”表中有一个名为“参数”的 json 列。json 是嵌套的并具有以下结构:
{
"params1": {"k": 1.1, "efficiency": 0.7},
"params2": {"k": 1.9, "C_max": 100.0, "C_min": 10.0}
}
Run Code Online (Sandbox Code Playgroud)
我只想更新“params2”中的一个值“k”,并保持其余值不变。我尝试使用以下代码:
update "Assets"
set "Parameters" = "Parameters"::jsonb || '{"params2":{"k":2.2}}'::jsonb
where "Id" = 185;
Run Code Online (Sandbox Code Playgroud)
这导致
{
"params1": {"k": 1.1, "efficiency": 0.7},
"params2": {"k": 2.2}
}
Run Code Online (Sandbox Code Playgroud)
因此“params2”中的其余参数被删除,这是不希望的。修改“k”并保持其余部分不变的方法是什么?
我正在尝试查询对象数组中存在的键。这种结构:
column jdata
{"name": "Somedata",
"array": [ {"name":"bla1", "attr": "somevalue"},
{"name":"bla2", "otherdata": "somevalue2"},
{"name":"bla3", "otherdata": "somevalue"}
],
"otherstuff": "stuff"
}
Run Code Online (Sandbox Code Playgroud)
现在我在jdata->'name'or上做 btree (jdata->'datetime')::cast,效果很好。
我也做 json_path_opsjdata->'array' @> '[{"name":"bla3"}]'真正的魅力所在。
我的问题是attr键可以在数组中的任何对象中,如果键存在,我关心记录,但是值几乎可以是任何东西。有没有办法查询这个?有没有办法索引它?我想做jdata->'array' @> '[{"attr": ?}]'或者也许? 'attr'可以在数组中以某种方式使用?
目前我正在考虑一个扫描键的触发器,然后将它移动到一个带有 true 或 false 或其他什么的标题,然后一个普通的 btree 将工作。有没有更好的办法?我需要在平均站点上编辑大约 50 万条记录才能添加这些值。
请给我指明一个方向。
如何从 Postgres 中的 json(b) 对象中提取/获取/选择“子对象”?
似乎有很多信息几乎可以让我到达那里,但又不完全是。很多关于转换为记录、过滤然后从中构建新对象的内容。说实话,我真的很惊讶这不是内置功能。也许有一种简单的方法可以通过组合内置 fns 来实现此目的?我正在寻找的本质上相当于select-keys;一个函数(比如jsonb_select_keys)给出了这个:
SELECT jsonb_select_keys('{"a":42,"b":43,"c":44,"d":97}', '{a,d,e}');
Run Code Online (Sandbox Code Playgroud)
会返回这个:
{"a":42,"d":97}
Run Code Online (Sandbox Code Playgroud)
有点像jsonb_path_query_array,但针对的是 kv 对而不是值。
我们有这个漂亮的 Postgres 树生成器。然而,它会产生一棵树的切口,而不是一次产生整棵树:
item_id jsonb_pretty
1 {
"title": "PARENT",
"item_id": 1,
"children": {
"title": "LEVEL 2",
"item_id": 2,
"children": {
"title": "LEVEL 3.2",
"item_id": 6
}
}
}
1 {
"title": "PARENT",
"item_id": 1,
"children": {
"title": "LEVEL 2",
"item_id": 2,
"children": {
"title": "LEVEL 3.1",
"item_id": 3,
"children": {
"title": "LEVEL 4.1",
"item_id": 4
}
}
}
}
1 {
"title": "PARENT",
"item_id": 1,
"children": {
"title": "LEVEL 2",
"item_id": 2,
"children": {
"title": "LEVEL 3.1",
"item_id": …Run Code Online (Sandbox Code Playgroud) 我正在尝试优化从 REST API 获得的值的提取,该 API 在数组中返回 json 值。
这是一个最小、完整且可验证的示例,它准确地反映了我在做什么。
USE tempdb;
DROP TABLE IF EXISTS dbo.json_test;
CREATE TABLE dbo.json_test
(
json_test_id int NOT NULL
IDENTITY(1,1)
, some_uniqueidentifier uniqueidentifier NULL
, some_varchar varchar(100) NULL
, the_json nvarchar(max) NULL
);
INSERT INTO dbo.json_test (some_uniqueidentifier, some_varchar, the_json)
SELECT
some_uniqueidentifier = NEWID()
, some_varchar = CONVERT(varchar(100), CRYPT_GEN_RANDOM(64), 1)
, the_json = (
SELECT st.*
FROM sys.tables st
CROSS JOIN sys.tables st2
WHERE st.object_id = t.object_id FOR JSON AUTO
)
FROM sys.tables t;
;WITH src …Run Code Online (Sandbox Code Playgroud) sql-server azure-sql-database cross-apply json sql-server-2019
到目前为止,我有以下查询,不幸的是,我无法使用正则表达式或大于运算符,我只能使用LIKE关键字。
整个列都在 json 字符串中,我无法使用json_value或 regexp,因为我在 SQL Server 上,所以我只能使用LIKE. 它是 SQL Server 2014,json_value直到 2016 年才受支持。
SELECT * FROM DataTableOne
WHERE update_date LIKE '%1645290000%'
Run Code Online (Sandbox Code Playgroud)
我想仅使用 SQL 关键字检索纪元 unix 时间戳大于 1645290000 的所有记录LIKE(甚至使用 SQLLIKE运算符在 1645290000 和 9999999999 之间)。
任何帮助将不胜感激,因为这是一个非常困难的独特案例,我只能使用关键字LIKE。
下面的示例表/数据:
CREATE TABLE DataTableOne (
ID int,
DATA varchar(MAX)
);
INSERT INTO DataTableOne (ID, DATA)
VALUES (1, '{"name":"Cole", "update_date":"2855290000"}'),
(2, '{"name":"Peter", "update_date":"1222290000"}') ;
Run Code Online (Sandbox Code Playgroud)
此类数据可能有一千行,而我只需要 update_date 大于 1645290000 …