在下面的示例中,如何转义 @data 变量中的双引号字符?
declare @data nvarchar(max) = N'"TEST"';
declare @jsonFragment nvarchar(max);
declare @id int = 999;
set @jsonFragment = ',"' + cast(@id as nvarchar(16)) + '":"' + @data + '"';
select @jsonFragment;
Run Code Online (Sandbox Code Playgroud)
结果是:
,"999":""TEST""
Run Code Online (Sandbox Code Playgroud)
我需要它是:
,"999":"\"TEST\""
Run Code Online (Sandbox Code Playgroud)
据我了解,选择for json path要求我定义一个静态键名称 - 但可以看出,我有一个场景,其中键名称是动态定义的。
在我的实际用例中,此字符串构造发生在一个stuff语句内,该语句本身是利用 CTE 的较大列定义的一部分select- 这意味着很难创建要使用sp_executeSQL.
我想使用聚合来构建一个简单的单维标量值 JSON 数组,如下面示例中的 LuckyNumbers 数组:
[{
"id": 1,
"name": "Josian",
"LuckyNumbers": [581, 777]
}, {
"id": 2,
"name": "Paul",
"LuckyNumbers": [123551, 5, 646464, 1345, 75, 76]
}, {
"id": 3,
"name": "Seasonique",
"LuckyNumbers": [1]
}]
Run Code Online (Sandbox Code Playgroud)
使用 Postgresql 12,您可以使用本机聚合函数(fiddle)来完成此操作
--Postgresql 12 schema
create table person ( Id int primary key, name varchar(20) );
insert into person values (1,'Josian'), (2,'Paul'), (3,'Seasonique');
create table LuckyNumbers (PersonId int references person(Id), LuckyNumber int);
insert into LuckyNumbers (PersonId, LuckyNumber) values (1,581), (1,777), (2,123551), (2,5), …Run Code Online (Sandbox Code Playgroud) 如何从 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) 到目前为止,我有以下查询,不幸的是,我无法使用正则表达式或大于运算符,我只能使用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 …
如果值匹配某些条件,MySql Json 替换特定索引处的数组值
例子:
{
"deploy": [
"Infrastructure",
"API Security"
],
"operate": [
"Pen Testing",
"Bug Bounty"
]
}
Run Code Online (Sandbox Code Playgroud)
这里我想用基础设施工具代替基础设施的价值
在此示例中,基础设施的索引为 0,但这可能因其他行而异
我试图解决这个问题的查询是
update table_config
set config = JSON_SET(config,JSON_SEARCH(config,'one',"Infrastructure"),"Infrastructure");
Run Code Online (Sandbox Code Playgroud)
哪个不运行
以下是我的表格:
CREATE TABLE `table_config` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`config` longtext,
`type` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
Run Code Online (Sandbox Code Playgroud) 我想对 json_agg 函数中的行进行排序。
我发现了这个: PostgreSQL : select columns inside json_agg
这给了我一个为 json_agg 选择特定列的解决方案,但现在我想给聚合数据一个特定的顺序。“distinct”确实有效,而“order by”则无效。
json_agg(DISTINCT (colA, colB))
Run Code Online (Sandbox Code Playgroud)
这不会:
json_agg(DISTINCT (colA, colB) ORDER BY colA ASC, colB ASC)
Run Code Online (Sandbox Code Playgroud)
有没有办法对聚合数据进行排序?
从我当前的查询中,我获得了这个 jsonb 数据:
values: "a1", ["b1", "b2"]
Run Code Online (Sandbox Code Playgroud)
我只想将它压平在一个级别上,如下所示:
values: "a1", "b1", "b2"
Run Code Online (Sandbox Code Playgroud)
这是在查询中获取数据的简化方法(只有 2 个级别是可能的,永远不会更多):
SELECT *
FROM jsonb_array_elements('{"test": ["a1", ["b1", "b2"]]}'::jsonb->'test');
Run Code Online (Sandbox Code Playgroud)
我尝试使用 jsonb_array_elements 但我的问题是:我不知道它是否是一个 json 数组!不是 SQL 专家,我没有找到一种方法来编写类似的代码:
SELECT
IF (is_json_array(list))
jsonb_array_elements(list)
ELSE
list
ENDIF
FROM jsonb_array_elements('{"test": ["a1", ["b1", "b2"]]}'::jsonb->'test');
Run Code Online (Sandbox Code Playgroud)
对于我当前数据的“缩小”视图,这是一个无表工作测试:
with recursive search_key_recursive (jsonlevel) as(
values ('{"fr": {"WantedKey": "a1", "Sub": [{"WantedKey": ["b1", "b2"]}], "AnotherSub": [{"WantedKey": "c1"}]}}'::jsonb)
union all
select
case jsonb_typeof(jsonlevel)
when 'object' then (jsonb_each(jsonlevel)).value
when 'array' then jsonb_array_elements(jsonlevel)
end as jsonlevel
from search_key_recursive where jsonb_typeof(jsonlevel) in ('object', …Run Code Online (Sandbox Code Playgroud) 我尝试使用Rest API (JSON export)with SSIS。由于似乎 aREST source不受支持,SSIS我正在寻找解决方案,但只能找到SSIS JSON Source。
是否有非专有解决方案,或者新的 SQL Server 2016 甚至支持此功能?
我检查了一下,也找不到任何具体的东西。
当我尝试使用一个 JSON 元素访问时,->>'elementName'我得到了一个text类型。
SELECT pg_typeof(x1->>'a'), jsonb_typeof(x2)
FROM ( VALUES
('{"a":5}'::jsonb, '5'::jsonb)
) AS t(x1,x2);
pg_typeof | jsonb_typeof
-----------+--------------
text | number
(1 row)
Run Code Online (Sandbox Code Playgroud)
但是,jsonb表示它将数字映射到数字类型......
将文本 JSON 输入转换为 jsonb 时,RFC 7159 描述的原始类型有效地映射到本机 PostgreSQL 类型,如表 8-23 所示。
这是从文档中复制的表格,
表 8-23。JSON 原始类型和对应的 PostgreSQL 类型
JSON primitive type PostgreSQL type Notes
string text \u0000 is disallowed, as are non-ASCII Unicode escapes if database encoding is not UTF8
number numeric NaN and infinity values are disallowed
boolean boolean …Run Code Online (Sandbox Code Playgroud)