Получить количество записей в корневом пути JSON без повторения? - PullRequest
0 голосов
/ 04 ноября 2019

Сбор нескольких статей в Интернете, в том числе этой с CTE и этой БЕЗ CTE , я добился успеха в получении необходимых мне данных, включая подсчетРезультаты. Однако мне нужно, чтобы этот счетчик находился в определенном месте в объекте JSON ... По сути, я знаю, как получить набор строк в определенную структуру JSON с помощью FOR JSON PATH, ROOT ('data') и т. Д.

Однако я делаюне знаю, как получить "recordsFiltered" в корне моего вывода JSON. Это количество выводится с использованием COUNT(*) OVER () AS recordsFiltered

По сути, мне нужно, чтобы моя структура выглядела так (см. Ниже) ... Как я могу получить "recordsFiltered" в корне $. результата JSON безон повторяется миллиард раз в разделе "data":[]?

Лучшая идея, которую я могу придумать, - создать временную таблицу, а затем использовать , что , для структурирования 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"
        },

        ...
    ]
}

Вот пример кода SQL:

 SELECT 
    COUNT(*) OVER () AS recordsFiltered,
    id,
    a,
    b
FROM t1
WHERE 
    (@Search IS NULL OR 
     id LIKE '%'+@Search+'%' OR 
     a LIKE '%'+@Search+'%' OR 
     b LIKE '%'+@Search+'%')
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, root ('data')

1 Ответ

1 голос
/ 04 ноября 2019

Похоже, вам нужно сгенерировать результаты таблицы, а затем использовать два (или более?) Подзапроса

Вот упрощенный пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...