Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL Server 2016 JSON - как найти последний элемент массива?  [new]
Santa89
Member

Откуда:
Сообщений: 1471
Есть JSON:

            "statusTransitions": {
                "Problem Statement": [
                    "2017-10-11 13:54:36"
                ],
                "Signed": [
                    "2017-10-11 13:55:17",
                    "2017-10-11 13:55:42"
                ],
                "Sign-off": [
                    "2017-10-11 13:55:10",
                    "2017-10-11 13:55:34"
                ]
            }


Т.е. в нём есть элемент Signed в виде массива из нескольких значений.
Понятно, что для того чтобы взять первый элемент нужно писать



SELECT *
FROM OPENJSON((@FileContents, 'lax $.issues')
WITH
(
[signed_status_date] datetime '$.statusTransitions."Signed"[0]'
)

А как выбрать последний элемент массива, если число таких элементов заранее неизвестно? Таких статусов Signed может быть например хоть 10ть...
25 окт 17, 11:05    [20897895]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2016 JSON - как найти последний элемент массива?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3459
Santa89
Есть JSON:

            "statusTransitions": {
                "Problem Statement": [
                    "2017-10-11 13:54:36"
                ],
                "Signed": [
                    "2017-10-11 13:55:17",
                    "2017-10-11 13:55:42"
                ],
                "Sign-off": [
                    "2017-10-11 13:55:10",
                    "2017-10-11 13:55:34"
                ]
            }


Т.е. в нём есть элемент Signed в виде массива из нескольких значений.
Понятно, что для того чтобы взять первый элемент нужно писать



SELECT *
FROM OPENJSON((@FileContents, 'lax $.issues')
WITH
(
[signed_status_date] datetime '$.statusTransitions."Signed"[0]'
)

А как выбрать последний элемент массива, если число таких элементов заранее неизвестно? Таких статусов Signed может быть например хоть 10ть...


А выбрать все и по нужному вам критерию выбрать требуемое?
25 окт 17, 11:30    [20898014]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2016 JSON - как найти последний элемент массива?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3459
https://stackoverflow.com/questions/42590025/how-to-reference-array-items-of-json-object-in-t-sql
25 окт 17, 11:32    [20898028]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2016 JSON - как найти последний элемент массива?  [new]
Santa89
Member

Откуда:
Сообщений: 1471
Ролг Хупин, главное - выбрать последний элемент массива.
Вот в JS это делается легко, что то типа:

jsonData.seats[jsonData.seats.length-1].countryid
25 окт 17, 11:39    [20898065]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2016 JSON - как найти последний элемент массива?  [new]
Santa89
Member

Откуда:
Сообщений: 1471
Ролг Хупин
https://stackoverflow.com/questions/42590025/how-to-reference-array-items-of-json-object-in-t-sql


Тут к сожалению код где длина массива задаётся вручную: declare @i int = 1
А у меня неизвестно сколько элементов будет в массиве
25 окт 17, 11:41    [20898083]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2016 JSON - как найти последний элемент массива?  [new]
Santa89
Member

Откуда:
Сообщений: 1471
Впринципе можно пройтись в цикле..но это такой косытилище...неужели нет варианта проще...
25 окт 17, 11:45    [20898103]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2016 JSON - как найти последний элемент массива?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3459
Santa89
Впринципе можно пройтись в цикле..но это такой косытилище...неужели нет варианта проще...


Может это и вариант, поскольку "первый", "последний" - это эмоции, если не указан порядок.
Вот еще вариант

https://habrahabr.ru/post/317166/

автор
Функция OPENJSON возвращает таблицу, которая определяет массив объектов, проиводит итерацию по массиву и выводит каждый элемент массива в строке.
25 окт 17, 11:52    [20898147]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2016 JSON - как найти последний элемент массива?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33258
Блог
Santa89,

избавьтесь от json еще на этапе загрузки в базу
26 окт 17, 16:58    [20903288]     Ответить | Цитировать Сообщить модератору
 Re: SQL Server 2016 JSON - как найти последний элемент массива?  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @json NVARCHAR(MAX) = '{
    "Problem Statement": [
        "2017-10-11 13:54:36"
    ],
    "Signed": [
        "2017-10-11 13:55:17",
        "2017-10-11 13:55:42"
    ],
    "Sign-off": [
        "2017-10-11 13:55:10",
        "2017-10-11 13:55:34"
    ]
}'

SELECT TOP(1) [value]
FROM OPENJSON(@json, '$.Signed')
ORDER BY [key] DESC
27 окт 17, 17:10    [20907458]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить