Анализ данных JSON для поиска одного элемента - PullRequest
0 голосов
/ 25 января 2019

Я просеиваю базу данных фильмов JSON и могу получить большую часть данных без проблем.Для каждого фильма я поместил необработанный JSON в столбец nvarchar (max) с именем jsondata, а затем добавил другие столбцы для заполнения для целей индексации и быстрого поиска.

С помощью моего оператора UPDATE я могу заполнить все столбцы, кроме одного, в котором мне нужно проанализировать и найти элемент.

Вот пример JSON:

{
"title": "Amnesia Love",
"genres": [{
    "id": 35,
    "name": "Comedy"
}],
"id": 508989,   
"original_language": "tl",
"overview": "A guy is trying to discover his true identity after being found unconscious in a remote island.",
"popularity": 2.583,
"release_date": "2018-02-28",   
"credits": {
    "cast": [{
        "cast_id": 2,
        "character": "",
        "credit_id": "5a9af6ecc3a3680b7d024627",
        "gender": 0,
        "id": 1230955,
        "name": "Paolo Ballesteros",
        "order": 1,
        "profile_path": "/8Cey11JPMWBCGuIcKBXvb6OQ7Je.jpg"
    },
    {
        "cast_id": 3,
        "character": "",
        "credit_id": "5a9af6f3c3a3680b57024465",
        "gender": 0,
        "id": 1166094,
        "name": "Yam Concepcion",
        "order": 2,
        "profile_path": "/fiPaXTkq440VHXDqlMRHtOpoLWT.jpg"
    }],
    "crew": [{
        "credit_id": "5a9af6cc0e0a260649024c6a",
        "department": "Directing",
        "gender": 0,
        "id": 1989658,
        "job": "Director",
        "name": "Albert Langitan",
        "profile_path": null
    },
    {
        "credit_id": "5a9af6dec3a3680b2d01f152",
        "department": "Writing",
        "gender": 0,
        "id": 1989658,
        "job": "Screenplay",
        "name": "Albert Langitan",
        "profile_path": null
    }]
},
}

Вот схема таблицы:

CREATE TABLE dbo.moviedb(
id int IDENTITY(1,1) NOT NULL,
jsondata nvarchar(max) NULL,
title nvarchar(200) NULL,
movie_id varchar(255) NULL,
original_language char(2) NULL,
overview nvarchar(1000) NULL,   
popularity float NULL,  
release_date datetime NULL, 
genre nvarchar(100) NULL,
director nvarchar(100)
)

Вот инструкция обновления для заполнения столбцов:

UPDATE t 
SET t.title = j.title, t.movie_id = j.id, t.original_language = j.original_language, 
t.overview = j.overview, t.popularity = j.popularity, t.release_date = j.release_date, 
t.genre = ISNULL(JSON_VALUE(t.jsondata,'$.genres[0].name'),''),
t.director = JSON_VALUE(t.jsondata,'$.credits.crew[0].name')
FROM tmdb t
 CROSS APPLY OPENJSON(jsondata)
WITH(title nvarchar(200), id int, original_language char(2), overview nvarchar(max),
 popularity float, release_date datetime, 
 genres nvarchar(max) as JSON, 
 credits nvarchar(max) as JSON
) AS j

Моя проблема заключается в получении имени директора.Так как в $ .credits есть элементы cast и crew, а внутри них, возможно, много записей каждая - мне не ясно, как разобрать через JSON_QUERY или использовать CROSS APPLY, чтобы сказать: «найдите $ .credits.crew.job = "Director", затем дайте мне $ .credits.crew.name '.

1 Ответ

0 голосов
/ 28 января 2019

Хорошо, после комментариев, я думаю, что у меня есть это сейчас. Я использую OUTER APPLY для режиссера, так как я все еще хочу получить информацию о фильме, даже если режиссер не указан. Это привело меня к еще одной проблеме - когда в фильме было более 1 режиссера. Но я думаю, что справлюсь с этим.

UPDATE t 
SET t.title = j.title, t.movie_id = j.id, t.original_language = j.original_language, 
t.overview = j.overview, t.popularity = j.popularity, t.release_date = j.release_date, 
t.genre = ISNULL(JSON_VALUE(t.jsondata,'$.genres[0].name'),''),
t.director = k.name
FROM tmdb t
  CROSS APPLY OPENJSON(jsondata)
WITH (title nvarchar(200), id int, original_language char(2), 
overview nvarchar(max), popularity float, release_date datetime, 
credits nvarchar(max) as JSON
) AS j
OUTER APPLY OPENJSON(j.credits,'$.crew') 
WITH (job nvarchar(50), name nvarchar(100)) AS k
WHERE k.job = 'Director' OR k.job IS NULL
...