在根JSON路径中获取记录计数而不重复?
在网上收集了几篇文章,包括这篇和这篇,我已经成功地获得了我需要的数据,包括结果计数。但是,我需要将此计数放在JSON对象中的特定位置。。。基本上,我知道如何使用JSON路径的在根JSON路径中获取记录计数而不重复?,json,sql-server,tsql,datatables,Json,Sql Server,Tsql,Datatables,在网上收集了几篇文章,包括这篇和这篇,我已经成功地获得了我需要的数据,包括结果计数。但是,我需要将此计数放在JSON对象中的特定位置。。。基本上,我知道如何使用JSON路径的、根('data')等将行集放入特定的JSON结构中 但是,我不知道如何将“recordsFiltered”放入JSON输出的根目录中。此计数是使用()上的count(*)作为已过滤记录导出的 基本上,我需要我的结构看起来像这样(见下文)。。。如何将“recordsFiltered”放入JSON结果的根$。,而不在的“dat
、根('data')
等将行集放入特定的JSON结构中
但是,我不知道如何将“recordsFiltered”放入JSON输出的根目录中。此计数是使用()上的count(*)作为已过滤记录导出的
基本上,我需要我的结构看起来像这样(见下文)。。。如何将“recordsFiltered”放入JSON结果的根$。
,而不在的“data”:[]
部分下重复10亿次
我能想到的最好办法是创建一个临时表,然后用它来构造JSON。但是,我想用奇特的SQL方式来做,如果有的话,在适当的地方使用SELECT语句或CTE
{
"draw": 1,
"recordsTotal": 57,
"recordsFiltered": 57, // <<<--- need records filtered HERE
"data": [
{
"DT_RowId": "row_3",
"recordsFiltered": "69,420", // <<<---- NOT HERE!!!
"first_name": "Angelica",
"last_name": "Ramos",
"position": "System Architect",
"office": "London",
"start_date": "9th Oct 09",
"salary": "$2,875"
},
...
]
}
看起来您需要生成表结果,然后使用两个(或更多?)子查询 下面是一个简化的示例:
declare @tbl table (ID int identity, Col1 varchar(50), Col2 int)
insert into @tbl (Col1, Col2) values ('A',1),('B',2),('C',3)
select
(select count(1) from @tbl) as 'total',
(select * from @tbl for json path) as 'data'
for json path
产生:
[
{
"total": 3,
"data": [
{
"ID": 1,
"Col1": "A",
"Col2": 1
},
{
"ID": 2,
"Col1": "B",
"Col2": 2
},
{
"ID": 3,
"Col1": "C",
"Col2": 3
}
]
}
]
在不了解其余代码/模式的情况下,我猜测您需要查询:
select
*
into
#MyTable
from
t1
WHERE
(@Search IS NULL OR
id LIKE '%'+@Search+'%' OR
a LIKE '%'+@Search+'%' OR
b LIKE '%'+@Search+'%')
select
(select count(*) from #MyTable) as recordsFiltered,
(
select
id,
a,
b
from
#MyTable
ORDER BY
CASE
WHEN @SortDir = 'ASC' THEN
CASE @SortCol
WHEN 0 THEN id
WHEN 1 THEN a
WHEN 2 THEN b
END
END desc,
CASE
WHEN @SortDir = 'desc' THEN
CASE @SortCol
WHEN 0 THEN id
WHEN 1 THEN a
WHEN 2 THEN b
END
END DESC
OFFSET @DisplayStart ROWS
FETCH NEXT @DisplayLength ROWS ONLY
for json path
) as [data]
for json path
使用CTE:
with cte as ()
select
*
from
t1
WHERE
(@Search IS NULL OR
id LIKE '%'+@Search+'%' OR
a LIKE '%'+@Search+'%' OR
b LIKE '%'+@Search+'%')
)
select
(select count(*) from cte) as recordsFiltered,
(
select
id,
a,
b
from
cte
ORDER BY
CASE
WHEN @SortDir = 'ASC' THEN
CASE @SortCol
WHEN 0 THEN id
WHEN 1 THEN a
WHEN 2 THEN b
END
END desc,
CASE
WHEN @SortDir = 'desc' THEN
CASE @SortCol
WHEN 0 THEN id
WHEN 1 THEN a
WHEN 2 THEN b
END
END DESC
OFFSET @DisplayStart ROWS
FETCH NEXT @DisplayLength ROWS ONLY
for json path
) as [data]
for json path
看起来你需要使用一个子选择,好的,所以你认为唯一的方法是使用一个临时表,对吗?因为那是我能想到的最好的主意!?你也可以使用CTE,我不确定哪一个性能最好。这可能取决于您的表大小、索引等
with cte as ()
select
*
from
t1
WHERE
(@Search IS NULL OR
id LIKE '%'+@Search+'%' OR
a LIKE '%'+@Search+'%' OR
b LIKE '%'+@Search+'%')
)
select
(select count(*) from cte) as recordsFiltered,
(
select
id,
a,
b
from
cte
ORDER BY
CASE
WHEN @SortDir = 'ASC' THEN
CASE @SortCol
WHEN 0 THEN id
WHEN 1 THEN a
WHEN 2 THEN b
END
END desc,
CASE
WHEN @SortDir = 'desc' THEN
CASE @SortCol
WHEN 0 THEN id
WHEN 1 THEN a
WHEN 2 THEN b
END
END DESC
OFFSET @DisplayStart ROWS
FETCH NEXT @DisplayLength ROWS ONLY
for json path
) as [data]
for json path