Невозможно получить доступ к ключам по индексу с помощью OPENJSON - PullRequest
0 голосов
/ 24 апреля 2018

В SQL как извлечь значение ключа по индексу [0]? ИЛИ, каков наилучший способ извлечь значение из этой структуры JSON?

declare @jsonString nvarchar(max)

set @jsonString = '{
"action": "edit",
"data": {
    "Accountable Inventory Technician|99999": {
        "PosTitle": "Accountable Inventory TECH",
        "Publish": "true"
    }
}
}'

Это даст мне название ключей, «действие» и «данные»:

select [key]
from OPENJSON(@jsonString, '$')

Это даст мне значение первого ключа в разделе «Ответственный специалист по инвентаризации ...»:

select *
from OPENJSON(@jsonString, '$.data')

Я не могу получить значение "action" . Это ничего не возвращает:

select *
from OPENJSON(@jsonString, 'lax $.action')

Я не могу сослаться по индексу . Это ничего не возвращает:

select *
from OPENJSON(@jsonString, '$.data[0].PosTitle')

Что я делаю не так?

1 Ответ

0 голосов
/ 24 апреля 2018

В SQL, как извлечь значение ключа по индексу [0]?ИЛИ, как лучше всего извлечь значение из этой структуры JSON?

Индекс JSON используется для массивов.Например, если ваш JSON имеет ["some","values","in","an","array"], то ссылка на элемент [0] будет иметь значение "some".В вашем примере нет массива, поэтому вы не сможете получить к нему доступ таким образом.

Я не могу получить значение "action".

ИспользованиеJSON_VALUE вы можете получить доступ к определенным элементам вашего объекта:

SELECT JSON_VALUE(@jsonString, '$.action') [action];
SELECT JSON_VALUE(@jsonString, '$.data."Accountable Inventory Technician|99999".PosTitle') PosTitle;

Если ваш JSON хранится в таблице, вы можете получить к нему доступ с помощью OPENJSON и CROSS APPLY

DROP TABLE IF EXISTS #json 
CREATE TABLE #json (JsonString NVARCHAR(MAX));

INSERT #json SELECT '{
    "action": "edit",
    "data": {
        "Accountable Inventory Technician|99999": {
            "PosTitle": "Accountable Inventory TECH",
            "Publish": "true"
        }
    }
    }'

SELECT * FROM #json j
CROSS APPLY
OPENJSON(j.JsonString)
WITH
    (
        [Action] varchar(255) '$.action',
        PosTitle varchar(255) '$.data."Accountable Inventory Technician|99999".PosTitle'
    );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...