2016-12-10 2 views
3

Привет я новичок в JSON, и хотел бы задать этот вопрос:SQL запросов к JSON

Так что моя цель пытается сделать результат выглядеть следующим образом:

{ 
    "userid": "10293304" ,  "segments": ["Online_Flag"] 
} 

{ 
    "userid": "10292298" , "segments": ["schedule_Appointment", "Enrolled_Order","Complete_Order"] 

} 

Я был в состоянии использовать T SQL для запроса результата выглядеть следующим образом:

[{"userid":"10293159","segments":[{"segment":"Schedule_Appointment"}]}, 
{"userid":"10293056","segments":[{"segment":"Schedule_Appointment"}]}, 
{"userid":"10292838","segments":[{"segment":"Schedule_Appointment"}]}, 

вопрос заключается в том, что мне нужно только, чтобы показать значение JSON (Schedule_Appointment), а не ключ (сегмент)

Есть ли способ (с помощью TSQL) скрыть ключи и показать только значения в массиве JSON?

Я попытался найти способы создания массива JSON с использованием SQL, но не повезло, если кто-нибудь может объяснить, я бы очень признателен.

SQL SERVER 2016

данных

CREATE TABLE [dbo].[Lotame_JSON](
[lead_id] [varchar](100) NULL, 
[dist_date_key] [date] NULL, 
[online_flag] [int] NULL, 
[sched_appt_qty] [int] NULL, 
[enroll_order_qty] [int] NULL, 
[compl_order_qty] [int] NULL) 

insert into [dbo].[Lotame_JSON] 
values('105646','2016-12-1',1,0,0,1) 

insert into [dbo].[Lotame_JSON] 
values('125646','2016-12-1',0,0,1,0) 

insert into [dbo].[Lotame_JSON] 
values('112646','2016-12-1',0,1,1,0) 

insert into [dbo].[Lotame_JSON] 
values('106446','2016-12-1',0,0,1,0) 

запроса у меня есть:

select 
[lead_id] AS 'userid', 
(
SELECT segment 
    from 
    (
     SELECT    
      CASE WHEN [online_flag] > 0 THEN '1' else null end as 'online_flag', 
      CASE WHEN sched_appt_qty > 0 THEN '2' else null end as 'Schedule_Appointment', 
      CASE WHEN enroll_order_qty > 0 THEN '3' else null end as 'Enrolled_Order', 
      CASE WHEN compl_order_qty > 0 THEN '4' else null end as 'Complete_Order' 
     FROM [dbo].[Lotame_JSON] as sub 
     WHERE sub.lead_id = main.lead_id 
    ) t 
    UNPIVOT 
    (
     segment1 
     for segment in (online_flag,Schedule_Appointment,Enrolled_Order,Complete_Order) 
    ) as UnPvot 
    for JSON PATH 
) AS 'segments' 
from [dbo].[Lotame_JSON] as main 
where online_flag = 0 and (sched_appt_qty > 0 or enroll_order_qty > 0 or compl_order_qty > 0) 
and dist_date_key >= '2016-9-1' 
FOR JSON PATH 

Благодаря

+0

Какую версию 'SQL SERVER' вы используете? –

+0

Также вы можете добавить запрос, который вы использовали для получения результата, который у вас есть. – NotMe

+0

обновлено, спасибо за помощь! – nghoang

ответ

2

Вы очень близки. Есть трюк для правильного формирования массивов JSON в SQL. Вы используете комбинацию JSON_QUERY, STUFF и FOR XML PATH данных, которые вы хотите получить в массиве. Чтобы получить результаты без внешних квадратных скобок, используйте FOR JSON PATH, WITHOUT_ARRAY_WRAPPER. Поместите все это вместе, и вы получите запрос, который выглядит так:

SELECT 
userid = [lead_id] 
,segments = JSON_QUERY(
         '[' + STUFF(
            (
             SELECT ',' + '"' + segment + '"' 
             FROM 
             (
              SELECT    
               CASE WHEN [online_flag] > 0 THEN '1' ELSE NULL END AS 'online_flag', 
               CASE WHEN sched_appt_qty > 0 THEN '2' ELSE NULL END AS 'Schedule_Appointment', 
               CASE WHEN enroll_order_qty > 0 THEN '3' ELSE NULL END AS 'Enrolled_Order', 
               CASE WHEN compl_order_qty > 0 THEN '4' ELSE NULL END AS 'Complete_Order' 
              FROM [dbo].[Lotame_JSON] AS sub 
              WHERE sub.lead_id = main.lead_id 
             ) t 
             UNPIVOT 
             (
              segment1 FOR segment IN (online_flag, Schedule_Appointment, Enrolled_Order, Complete_Order) 
             ) AS UnPvot 
             FOR XML PATH ('') 
            ) 
         , 1, 1, '') + ']' 
        ) 
FROM [dbo].[Lotame_JSON] AS main 
WHERE online_flag = 0 
    AND dist_date_key >= '2016-9-1' 
    AND (
      sched_appt_qty > 0 
      OR enroll_order_qty > 0 
      OR compl_order_qty > 0 
     ) 
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER 
Смежные вопросы