Flatten array with OPENJSON: OPENJSON on a value that may not be an array? [ [1] ], vs [1]Find Ancestry From JSONHow to remove known elements from a JSON[] array in PostgreSQL?Can I find all JSON scalars in PostgreSQL 9.3?PostgreSql : flatten json array dataCan SQL Server 2016 validate JSON on insert?Working with JSON data MySQLImport poorly formatted CSV/JSON to SQL ServerList JSON array in MySQL as rowsDynamic conversion of long data to wide with multiple columnsIs the MySQL JSON data type bad for performance for data retrieval?Columnstore index for Key/Value Pair table on SQL Server

How to say "to make my heart sing"

How can I deal with a player trying to insert real-world mythology into my homebrew setting?

Book where the stars go black due to aliens stopping human observation collapsing quantum possibilities

Is "take care'n of" correct?

Should I intentionally omit previous work experience when applying for jobs?

How is angular momentum conserved for the orbiting body if the centripetal force disappears?

Parse source code of the RAPID robot-automation language

Keep milk (or milk alternative) for a day without a fridge

How were Martello towers supposed to work?

How to hide what's behind an object in a non destructive way / give it an "invisibility cloak"

Managing and organizing the massively increased number of classes after switching to SOLID?

Why isn't there research to build a standard lunar, or Martian mobility platform?

definition of "percentile"

Single word for "refusing to move to next activity unless present one is completed."

references on the empirical study on the practice of OR

Can I call 112 to check a police officer's identity in the Czech Republic?

Should disabled buttons give feedback when clicked?

Was I subtly told to resign?

How do Windows version numbers work?

Was the Ford Model T black because of the speed black paint dries?

What does "it kind of works out" mean?

How to find the shape parameters of of a beta distribution given the position of two quantiles?

How can I get a player to accept that they should stop trying to pull stunts without thinking them through first?

Maximum charterer insertion



Flatten array with OPENJSON: OPENJSON on a value that may not be an array? [ [1] ], vs [1]


Find Ancestry From JSONHow to remove known elements from a JSON[] array in PostgreSQL?Can I find all JSON scalars in PostgreSQL 9.3?PostgreSql : flatten json array dataCan SQL Server 2016 validate JSON on insert?Working with JSON data MySQLImport poorly formatted CSV/JSON to SQL ServerList JSON array in MySQL as rowsDynamic conversion of long data to wide with multiple columnsIs the MySQL JSON data type bad for performance for data retrieval?Columnstore index for Key/Value Pair table on SQL Server






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








4















Frequently in Javascript you'll have something like



[ 7,2, [6,7], 2,10 ]


How would you query that structure with OPENJSON I would like this,



0, 7
1, 2
2, 6,
2, 7,
3, 2
4, 10


I'm having a hard time conditionally unwrapping that JSON array.



Sample Data



declare @ex nvarchar(max) = '[ 7,2, [6,7], 2,10 ]';


My attempt



Find my query here



SELECT *
FROM OPENJSON(@ex, '$') AS j1


This gets you to,



key value type
0 7 2
1 2 2
2 [6,7] 4
3 2 2
4 10 2


If I try to CROSS APPLY OPENJSON(j1."value", '$') AS j2;, I get an error about the 7, the first non-array being an invalid array,




Msg 13609 Level 16 State 4 Line 4



JSON text is not properly formatted. Unexpected character '7' is found at position 0.




How do I use CROSS APPLY OPENJSON to conditionally unwrap the rows that are arrays (type=4) while leaving alone non-arrays (in the above like type=2)? I don't want that [6,7] in there. I want two rows with key=2 that have values 6, and 7 respectively.










share|improve this question






























    4















    Frequently in Javascript you'll have something like



    [ 7,2, [6,7], 2,10 ]


    How would you query that structure with OPENJSON I would like this,



    0, 7
    1, 2
    2, 6,
    2, 7,
    3, 2
    4, 10


    I'm having a hard time conditionally unwrapping that JSON array.



    Sample Data



    declare @ex nvarchar(max) = '[ 7,2, [6,7], 2,10 ]';


    My attempt



    Find my query here



    SELECT *
    FROM OPENJSON(@ex, '$') AS j1


    This gets you to,



    key value type
    0 7 2
    1 2 2
    2 [6,7] 4
    3 2 2
    4 10 2


    If I try to CROSS APPLY OPENJSON(j1."value", '$') AS j2;, I get an error about the 7, the first non-array being an invalid array,




    Msg 13609 Level 16 State 4 Line 4



    JSON text is not properly formatted. Unexpected character '7' is found at position 0.




    How do I use CROSS APPLY OPENJSON to conditionally unwrap the rows that are arrays (type=4) while leaving alone non-arrays (in the above like type=2)? I don't want that [6,7] in there. I want two rows with key=2 that have values 6, and 7 respectively.










    share|improve this question


























      4












      4








      4








      Frequently in Javascript you'll have something like



      [ 7,2, [6,7], 2,10 ]


      How would you query that structure with OPENJSON I would like this,



      0, 7
      1, 2
      2, 6,
      2, 7,
      3, 2
      4, 10


      I'm having a hard time conditionally unwrapping that JSON array.



      Sample Data



      declare @ex nvarchar(max) = '[ 7,2, [6,7], 2,10 ]';


      My attempt



      Find my query here



      SELECT *
      FROM OPENJSON(@ex, '$') AS j1


      This gets you to,



      key value type
      0 7 2
      1 2 2
      2 [6,7] 4
      3 2 2
      4 10 2


      If I try to CROSS APPLY OPENJSON(j1."value", '$') AS j2;, I get an error about the 7, the first non-array being an invalid array,




      Msg 13609 Level 16 State 4 Line 4



      JSON text is not properly formatted. Unexpected character '7' is found at position 0.




      How do I use CROSS APPLY OPENJSON to conditionally unwrap the rows that are arrays (type=4) while leaving alone non-arrays (in the above like type=2)? I don't want that [6,7] in there. I want two rows with key=2 that have values 6, and 7 respectively.










      share|improve this question
















      Frequently in Javascript you'll have something like



      [ 7,2, [6,7], 2,10 ]


      How would you query that structure with OPENJSON I would like this,



      0, 7
      1, 2
      2, 6,
      2, 7,
      3, 2
      4, 10


      I'm having a hard time conditionally unwrapping that JSON array.



      Sample Data



      declare @ex nvarchar(max) = '[ 7,2, [6,7], 2,10 ]';


      My attempt



      Find my query here



      SELECT *
      FROM OPENJSON(@ex, '$') AS j1


      This gets you to,



      key value type
      0 7 2
      1 2 2
      2 [6,7] 4
      3 2 2
      4 10 2


      If I try to CROSS APPLY OPENJSON(j1."value", '$') AS j2;, I get an error about the 7, the first non-array being an invalid array,




      Msg 13609 Level 16 State 4 Line 4



      JSON text is not properly formatted. Unexpected character '7' is found at position 0.




      How do I use CROSS APPLY OPENJSON to conditionally unwrap the rows that are arrays (type=4) while leaving alone non-arrays (in the above like type=2)? I don't want that [6,7] in there. I want two rows with key=2 that have values 6, and 7 respectively.







      sql-server json






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 8 hours ago







      Evan Carroll

















      asked 9 hours ago









      Evan CarrollEvan Carroll

      34.7k11 gold badges89 silver badges256 bronze badges




      34.7k11 gold badges89 silver badges256 bronze badges




















          2 Answers
          2






          active

          oldest

          votes


















          6














          If you are strictly confident that your nested arrays will never go deeper than N levels, you can completely unwrap the array-of-arrays with N uses of APPLY. If you need to handle for arbitrary nesting levels, you can unwrap the array-of-arrays recursively using something like the following, which will produce output similar to the following




          |----|-------|---------|-----|-------|------|
          | id | level | path | key | value | type |
          |----|-------|---------|-----|-------|------|
          | 1 | 1 | /0 | 0 | 7 | 2 |
          | 1 | 1 | /1 | 1 | 2 | 2 |
          | 1 | 2 | /2/0 | 0 | 6 | 2 |
          | 1 | 2 | /2/1 | 1 | 7 | 2 |
          | 1 | 1 | /3 | 3 | 2 | 2 |
          | 1 | 1 | /4 | 4 | 10 | 2 |
          |----|-------|---------|-----|-------|------|


          DB Fiddle



          declare @ex table ( 
          i int identity primary key,
          r nvarchar(max)
          );
          insert @ex (r)
          values ('[ 7,2, [6,7], 2, 10 ]')
          ,('[ 7,2, [6,7], 2, 10 , [6,[7,8]]]')
          ;

          with j as (
          select
          x.i as id,
          convert(int,1) as [level],
          convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]) as [path],
          a.[key],
          a.[value],
          a.[type]
          from @ex x
          cross apply openjson(x.r) a
          union all
          select
          j. id,
          j.[level] + 1,
          j.[path] + convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]),
          a.[key],
          a.[value],
          a.[type]
          from j
          cross apply openjson(j.value) a
          where j.type in (4,5)
          and j.level < 50 --maxrecursion
          )
          select *
          from j
          where type not in (4,5)
          order by id, [path];


          Testing against the 2-level deep nested array from the above example produces the following:




          |----|-------|---------|-----|-------|------|
          | id | level | path | key | value | type |
          |----|-------|---------|-----|-------|------|
          | 2 | 1 | /0 | 0 | 7 | 2 |
          | 2 | 1 | /1 | 1 | 2 | 2 |
          | 2 | 2 | /2/0 | 0 | 6 | 2 |
          | 2 | 2 | /2/1 | 1 | 7 | 2 |
          | 2 | 1 | /3 | 3 | 2 | 2 |
          | 2 | 1 | /4 | 4 | 10 | 2 |
          | 2 | 2 | /5/0 | 0 | 6 | 2 |
          | 2 | 3 | /5/1/0 | 0 | 7 | 2 |
          | 2 | 3 | /5/1/1 | 1 | 8 | 2 |
          |----|-------|---------|-----|-------|------|


          See this question also for related material.






          share|improve this answer
































            4














            declare @ex nvarchar(max) = '[ 7,2, [6,7], 2, 10 ]';


            ;WITH cte
            AS (
            SELECT *
            FROM OPENJSON(@ex, '$') AS j1
            )
            SELECT c.[key], ISNULL(v.value, c.value)
            FROM cte c
            OUTER APPLY (
            SELECT *
            FROM OPENJSON(c.value, '$') AS j1
            WHERE c.[type] = 4

            )v
            ;





            share|improve this answer

























              Your Answer








              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "182"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: false,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: null,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f242662%2fflatten-array-with-openjson-openjson-on-a-value-that-may-not-be-an-array-1%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              6














              If you are strictly confident that your nested arrays will never go deeper than N levels, you can completely unwrap the array-of-arrays with N uses of APPLY. If you need to handle for arbitrary nesting levels, you can unwrap the array-of-arrays recursively using something like the following, which will produce output similar to the following




              |----|-------|---------|-----|-------|------|
              | id | level | path | key | value | type |
              |----|-------|---------|-----|-------|------|
              | 1 | 1 | /0 | 0 | 7 | 2 |
              | 1 | 1 | /1 | 1 | 2 | 2 |
              | 1 | 2 | /2/0 | 0 | 6 | 2 |
              | 1 | 2 | /2/1 | 1 | 7 | 2 |
              | 1 | 1 | /3 | 3 | 2 | 2 |
              | 1 | 1 | /4 | 4 | 10 | 2 |
              |----|-------|---------|-----|-------|------|


              DB Fiddle



              declare @ex table ( 
              i int identity primary key,
              r nvarchar(max)
              );
              insert @ex (r)
              values ('[ 7,2, [6,7], 2, 10 ]')
              ,('[ 7,2, [6,7], 2, 10 , [6,[7,8]]]')
              ;

              with j as (
              select
              x.i as id,
              convert(int,1) as [level],
              convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]) as [path],
              a.[key],
              a.[value],
              a.[type]
              from @ex x
              cross apply openjson(x.r) a
              union all
              select
              j. id,
              j.[level] + 1,
              j.[path] + convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]),
              a.[key],
              a.[value],
              a.[type]
              from j
              cross apply openjson(j.value) a
              where j.type in (4,5)
              and j.level < 50 --maxrecursion
              )
              select *
              from j
              where type not in (4,5)
              order by id, [path];


              Testing against the 2-level deep nested array from the above example produces the following:




              |----|-------|---------|-----|-------|------|
              | id | level | path | key | value | type |
              |----|-------|---------|-----|-------|------|
              | 2 | 1 | /0 | 0 | 7 | 2 |
              | 2 | 1 | /1 | 1 | 2 | 2 |
              | 2 | 2 | /2/0 | 0 | 6 | 2 |
              | 2 | 2 | /2/1 | 1 | 7 | 2 |
              | 2 | 1 | /3 | 3 | 2 | 2 |
              | 2 | 1 | /4 | 4 | 10 | 2 |
              | 2 | 2 | /5/0 | 0 | 6 | 2 |
              | 2 | 3 | /5/1/0 | 0 | 7 | 2 |
              | 2 | 3 | /5/1/1 | 1 | 8 | 2 |
              |----|-------|---------|-----|-------|------|


              See this question also for related material.






              share|improve this answer





























                6














                If you are strictly confident that your nested arrays will never go deeper than N levels, you can completely unwrap the array-of-arrays with N uses of APPLY. If you need to handle for arbitrary nesting levels, you can unwrap the array-of-arrays recursively using something like the following, which will produce output similar to the following




                |----|-------|---------|-----|-------|------|
                | id | level | path | key | value | type |
                |----|-------|---------|-----|-------|------|
                | 1 | 1 | /0 | 0 | 7 | 2 |
                | 1 | 1 | /1 | 1 | 2 | 2 |
                | 1 | 2 | /2/0 | 0 | 6 | 2 |
                | 1 | 2 | /2/1 | 1 | 7 | 2 |
                | 1 | 1 | /3 | 3 | 2 | 2 |
                | 1 | 1 | /4 | 4 | 10 | 2 |
                |----|-------|---------|-----|-------|------|


                DB Fiddle



                declare @ex table ( 
                i int identity primary key,
                r nvarchar(max)
                );
                insert @ex (r)
                values ('[ 7,2, [6,7], 2, 10 ]')
                ,('[ 7,2, [6,7], 2, 10 , [6,[7,8]]]')
                ;

                with j as (
                select
                x.i as id,
                convert(int,1) as [level],
                convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]) as [path],
                a.[key],
                a.[value],
                a.[type]
                from @ex x
                cross apply openjson(x.r) a
                union all
                select
                j. id,
                j.[level] + 1,
                j.[path] + convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]),
                a.[key],
                a.[value],
                a.[type]
                from j
                cross apply openjson(j.value) a
                where j.type in (4,5)
                and j.level < 50 --maxrecursion
                )
                select *
                from j
                where type not in (4,5)
                order by id, [path];


                Testing against the 2-level deep nested array from the above example produces the following:




                |----|-------|---------|-----|-------|------|
                | id | level | path | key | value | type |
                |----|-------|---------|-----|-------|------|
                | 2 | 1 | /0 | 0 | 7 | 2 |
                | 2 | 1 | /1 | 1 | 2 | 2 |
                | 2 | 2 | /2/0 | 0 | 6 | 2 |
                | 2 | 2 | /2/1 | 1 | 7 | 2 |
                | 2 | 1 | /3 | 3 | 2 | 2 |
                | 2 | 1 | /4 | 4 | 10 | 2 |
                | 2 | 2 | /5/0 | 0 | 6 | 2 |
                | 2 | 3 | /5/1/0 | 0 | 7 | 2 |
                | 2 | 3 | /5/1/1 | 1 | 8 | 2 |
                |----|-------|---------|-----|-------|------|


                See this question also for related material.






                share|improve this answer



























                  6












                  6








                  6







                  If you are strictly confident that your nested arrays will never go deeper than N levels, you can completely unwrap the array-of-arrays with N uses of APPLY. If you need to handle for arbitrary nesting levels, you can unwrap the array-of-arrays recursively using something like the following, which will produce output similar to the following




                  |----|-------|---------|-----|-------|------|
                  | id | level | path | key | value | type |
                  |----|-------|---------|-----|-------|------|
                  | 1 | 1 | /0 | 0 | 7 | 2 |
                  | 1 | 1 | /1 | 1 | 2 | 2 |
                  | 1 | 2 | /2/0 | 0 | 6 | 2 |
                  | 1 | 2 | /2/1 | 1 | 7 | 2 |
                  | 1 | 1 | /3 | 3 | 2 | 2 |
                  | 1 | 1 | /4 | 4 | 10 | 2 |
                  |----|-------|---------|-----|-------|------|


                  DB Fiddle



                  declare @ex table ( 
                  i int identity primary key,
                  r nvarchar(max)
                  );
                  insert @ex (r)
                  values ('[ 7,2, [6,7], 2, 10 ]')
                  ,('[ 7,2, [6,7], 2, 10 , [6,[7,8]]]')
                  ;

                  with j as (
                  select
                  x.i as id,
                  convert(int,1) as [level],
                  convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]) as [path],
                  a.[key],
                  a.[value],
                  a.[type]
                  from @ex x
                  cross apply openjson(x.r) a
                  union all
                  select
                  j. id,
                  j.[level] + 1,
                  j.[path] + convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]),
                  a.[key],
                  a.[value],
                  a.[type]
                  from j
                  cross apply openjson(j.value) a
                  where j.type in (4,5)
                  and j.level < 50 --maxrecursion
                  )
                  select *
                  from j
                  where type not in (4,5)
                  order by id, [path];


                  Testing against the 2-level deep nested array from the above example produces the following:




                  |----|-------|---------|-----|-------|------|
                  | id | level | path | key | value | type |
                  |----|-------|---------|-----|-------|------|
                  | 2 | 1 | /0 | 0 | 7 | 2 |
                  | 2 | 1 | /1 | 1 | 2 | 2 |
                  | 2 | 2 | /2/0 | 0 | 6 | 2 |
                  | 2 | 2 | /2/1 | 1 | 7 | 2 |
                  | 2 | 1 | /3 | 3 | 2 | 2 |
                  | 2 | 1 | /4 | 4 | 10 | 2 |
                  | 2 | 2 | /5/0 | 0 | 6 | 2 |
                  | 2 | 3 | /5/1/0 | 0 | 7 | 2 |
                  | 2 | 3 | /5/1/1 | 1 | 8 | 2 |
                  |----|-------|---------|-----|-------|------|


                  See this question also for related material.






                  share|improve this answer















                  If you are strictly confident that your nested arrays will never go deeper than N levels, you can completely unwrap the array-of-arrays with N uses of APPLY. If you need to handle for arbitrary nesting levels, you can unwrap the array-of-arrays recursively using something like the following, which will produce output similar to the following




                  |----|-------|---------|-----|-------|------|
                  | id | level | path | key | value | type |
                  |----|-------|---------|-----|-------|------|
                  | 1 | 1 | /0 | 0 | 7 | 2 |
                  | 1 | 1 | /1 | 1 | 2 | 2 |
                  | 1 | 2 | /2/0 | 0 | 6 | 2 |
                  | 1 | 2 | /2/1 | 1 | 7 | 2 |
                  | 1 | 1 | /3 | 3 | 2 | 2 |
                  | 1 | 1 | /4 | 4 | 10 | 2 |
                  |----|-------|---------|-----|-------|------|


                  DB Fiddle



                  declare @ex table ( 
                  i int identity primary key,
                  r nvarchar(max)
                  );
                  insert @ex (r)
                  values ('[ 7,2, [6,7], 2, 10 ]')
                  ,('[ 7,2, [6,7], 2, 10 , [6,[7,8]]]')
                  ;

                  with j as (
                  select
                  x.i as id,
                  convert(int,1) as [level],
                  convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]) as [path],
                  a.[key],
                  a.[value],
                  a.[type]
                  from @ex x
                  cross apply openjson(x.r) a
                  union all
                  select
                  j. id,
                  j.[level] + 1,
                  j.[path] + convert(nvarchar(max),N'/')+convert(nvarchar(max),a.[key]),
                  a.[key],
                  a.[value],
                  a.[type]
                  from j
                  cross apply openjson(j.value) a
                  where j.type in (4,5)
                  and j.level < 50 --maxrecursion
                  )
                  select *
                  from j
                  where type not in (4,5)
                  order by id, [path];


                  Testing against the 2-level deep nested array from the above example produces the following:




                  |----|-------|---------|-----|-------|------|
                  | id | level | path | key | value | type |
                  |----|-------|---------|-----|-------|------|
                  | 2 | 1 | /0 | 0 | 7 | 2 |
                  | 2 | 1 | /1 | 1 | 2 | 2 |
                  | 2 | 2 | /2/0 | 0 | 6 | 2 |
                  | 2 | 2 | /2/1 | 1 | 7 | 2 |
                  | 2 | 1 | /3 | 3 | 2 | 2 |
                  | 2 | 1 | /4 | 4 | 10 | 2 |
                  | 2 | 2 | /5/0 | 0 | 6 | 2 |
                  | 2 | 3 | /5/1/0 | 0 | 7 | 2 |
                  | 2 | 3 | /5/1/1 | 1 | 8 | 2 |
                  |----|-------|---------|-----|-------|------|


                  See this question also for related material.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited 7 hours ago

























                  answered 8 hours ago









                  Peter VandivierPeter Vandivier

                  1,7461 gold badge9 silver badges23 bronze badges




                  1,7461 gold badge9 silver badges23 bronze badges























                      4














                      declare @ex nvarchar(max) = '[ 7,2, [6,7], 2, 10 ]';


                      ;WITH cte
                      AS (
                      SELECT *
                      FROM OPENJSON(@ex, '$') AS j1
                      )
                      SELECT c.[key], ISNULL(v.value, c.value)
                      FROM cte c
                      OUTER APPLY (
                      SELECT *
                      FROM OPENJSON(c.value, '$') AS j1
                      WHERE c.[type] = 4

                      )v
                      ;





                      share|improve this answer



























                        4














                        declare @ex nvarchar(max) = '[ 7,2, [6,7], 2, 10 ]';


                        ;WITH cte
                        AS (
                        SELECT *
                        FROM OPENJSON(@ex, '$') AS j1
                        )
                        SELECT c.[key], ISNULL(v.value, c.value)
                        FROM cte c
                        OUTER APPLY (
                        SELECT *
                        FROM OPENJSON(c.value, '$') AS j1
                        WHERE c.[type] = 4

                        )v
                        ;





                        share|improve this answer

























                          4












                          4








                          4







                          declare @ex nvarchar(max) = '[ 7,2, [6,7], 2, 10 ]';


                          ;WITH cte
                          AS (
                          SELECT *
                          FROM OPENJSON(@ex, '$') AS j1
                          )
                          SELECT c.[key], ISNULL(v.value, c.value)
                          FROM cte c
                          OUTER APPLY (
                          SELECT *
                          FROM OPENJSON(c.value, '$') AS j1
                          WHERE c.[type] = 4

                          )v
                          ;





                          share|improve this answer













                          declare @ex nvarchar(max) = '[ 7,2, [6,7], 2, 10 ]';


                          ;WITH cte
                          AS (
                          SELECT *
                          FROM OPENJSON(@ex, '$') AS j1
                          )
                          SELECT c.[key], ISNULL(v.value, c.value)
                          FROM cte c
                          OUTER APPLY (
                          SELECT *
                          FROM OPENJSON(c.value, '$') AS j1
                          WHERE c.[type] = 4

                          )v
                          ;






                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered 8 hours ago









                          Denis RubashkinDenis Rubashkin

                          9131 silver badge9 bronze badges




                          9131 silver badge9 bronze badges



























                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to Database Administrators Stack Exchange!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f242662%2fflatten-array-with-openjson-openjson-on-a-value-that-may-not-be-an-array-1%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Canceling a color specificationRandomly assigning color to Graphics3D objects?Default color for Filling in Mathematica 9Coloring specific elements of sets with a prime modified order in an array plotHow to pick a color differing significantly from the colors already in a given color list?Detection of the text colorColor numbers based on their valueCan color schemes for use with ColorData include opacity specification?My dynamic color schemes

                              Invision Community Contents History See also References External links Navigation menuProprietaryinvisioncommunity.comIPS Community ForumsIPS Community Forumsthis blog entry"License Changes, IP.Board 3.4, and the Future""Interview -- Matt Mecham of Ibforums""CEO Invision Power Board, Matt Mecham Is a Liar, Thief!"IPB License Explanation 1.3, 1.3.1, 2.0, and 2.1ArchivedSecurity Fixes, Updates And Enhancements For IPB 1.3.1Archived"New Demo Accounts - Invision Power Services"the original"New Default Skin"the original"Invision Power Board 3.0.0 and Applications Released"the original"Archived copy"the original"Perpetual licenses being done away with""Release Notes - Invision Power Services""Introducing: IPS Community Suite 4!"Invision Community Release Notes

                              199年 目錄 大件事 到箇年出世嗰人 到箇年死嗰人 節慶、風俗習慣 導覽選單