Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在根JSON路径中获取记录计数而不重复?_Json_Sql Server_Tsql_Datatables - Fatal编程技术网

在根JSON路径中获取记录计数而不重复?

在根JSON路径中获取记录计数而不重复?,json,sql-server,tsql,datatables,Json,Sql Server,Tsql,Datatables,在网上收集了几篇文章,包括这篇和这篇,我已经成功地获得了我需要的数据,包括结果计数。但是,我需要将此计数放在JSON对象中的特定位置。。。基本上,我知道如何使用JSON路径的、根('data')等将行集放入特定的JSON结构中 但是,我不知道如何将“recordsFiltered”放入JSON输出的根目录中。此计数是使用()上的count(*)作为已过滤记录导出的 基本上,我需要我的结构看起来像这样(见下文)。。。如何将“recordsFiltered”放入JSON结果的根$。,而不在的“dat

在网上收集了几篇文章,包括这篇和这篇,我已经成功地获得了我需要的数据,包括结果计数。但是,我需要将此计数放在JSON对象中的特定位置。。。基本上,我知道如何使用JSON路径的
、根('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