标签: json

正确转义 JSON 字符串中的字符

在下面的示例中,如何转义 @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.

t-sql json sql-server-2016

5
推荐指数
1
解决办法
8174
查看次数

Sql Server - 从聚合构建整数的 json 数组

我想使用聚合来构建一个简单的单维标量值 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)

sql-server json sql-server-2019

5
推荐指数
1
解决办法
7589
查看次数

如何从 JSONB 中选择具有给定键的子对象?

如何从 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 对而不是值。

postgresql functions json

5
推荐指数
1
解决办法
4867
查看次数

如何将一组扁平树变成一棵具有多个叶子的树?

我们有这个漂亮的 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)

postgresql tree cte json recursive

5
推荐指数
1
解决办法
1478
查看次数

仅使用 LIKE 运算符记录大于纪元时间戳的记录

到目前为止,我有以下查询,不幸的是,我无法使用正则表达式大于运算符,我只能使用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 …

sql-server json sql-server-2014 like date-math

5
推荐指数
2
解决办法
1185
查看次数

MySql Json 替换数组值

如果值匹配某些条件,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)

mysql json mysql-5.7

5
推荐指数
1
解决办法
2215
查看次数

订购 json_agg 中的特定列

我想对 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)

有没有办法对聚合数据进行排序?

postgresql postgresql-9.3 json

4
推荐指数
1
解决办法
1万
查看次数

PostgreSql:展平 json 数组数据

从我当前的查询中,我获得了这个 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)

postgresql array json postgresql-9.4

4
推荐指数
1
解决办法
9309
查看次数

使用 SSIS 使用 Rest Api

我尝试使用Rest API (JSON export)with SSIS。由于似乎 aREST source不受支持,SSIS我正在寻找解决方案,但只能找到SSIS JSON Source

是否有非专有解决方案,或者新的 SQL Server 2016 甚至支持此功能?
我检查了一下,也找不到任何具体的东西。

sql-server ssis json sql-server-2016

4
推荐指数
1
解决办法
2万
查看次数

为什么 JSON 元素在不是文本时返回文本?

当我尝试使用一个 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)

postgresql datatypes database-internals json operator

4
推荐指数
1
解决办法
1780
查看次数