AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 168303
Accepted
peterk411
peterk411
Asked: 2017-03-28 10:51:03 +0800 CST2017-03-28 10:51:03 +0800 CST 2017-03-28 10:51:03 +0800 CST

O SQL Server 2016 pode extrair nomes de nós do JSON?

  • 772

Desejo extrair uma lista completa dos nomes dos nós e seus caminhos de qualquer documento JSON arbitrário e bem formado armazenado como valor nvarchar no SQL Server 2016. Existe uma maneira confiável de fazer isso?

Por exemplo, para um valor json:

DECLARE @json_doc nvarchar(4000) = '{"Name1":"Value1", "Name2":"Value2"}'

Obtenha este resultado ao consultar @json_doc:

NODE_NAME
$.Name1
$.Name2
t-sql sql-server-2016
  • 3 3 respostas
  • 6876 Views

3 respostas

  • Voted
  1. Best Answer
    McNets
    2017-03-28T11:04:32+08:002017-03-28T11:04:32+08:00

    Selecione [chave] do esquema OPENJSON padrão .

    DECLARE @json_doc nvarchar(4000) = '{"Name1":"Value1", "Name2":"Value2"}';
    
    SELECT [key]
    FROM OPENJSON(@json_doc);
    GO
    
    | chave |
    | :---- |
    | Nome1 |
    | Nome2 |
    

    dbfiddle aqui

    • 9
  2. Jon49
    2018-11-09T13:01:19+08:002018-11-09T13:01:19+08:00

    Para adicionar a esta resposta.

    Obtenha todas as chaves JSON em uma coluna:

    SELECT Keys.[key]
    FROM dbo.<table_name> t
    CROSS APPLY (
        SELECT [key] [key]
        FROM OPENJSON((SELECT t.<column_name>))
    ) Keys
    

    Por exemplo, Tabela :

    +------------------+
    | JSONValues       |
    +==================+
    | {"myKey":1}      |
    +------------------+
    | {"myOtherKey":1} |
    +------------------+
    

    Resultado da consulta :

    +------------+
    | Result     |
    +============+
    | myKey      |
    +------------+
    | myOtherKey |
    +------------+
    

    Obtenha todas as chaves JSON em que JSON é uma matriz de objetos:

    SELECT DISTINCT Keys.[key]
    FROM dbo.<table_name, sysname, sample_table> t
    CROSS APPLY (
        SELECT x.[value] [value]
        FROM OPENJSON((SELECT t.<json_colum_name, sysname, sample_column>)) x
    ) ArrayJSON
    CROSS APPLY (
        SELECT [key] [key]
        FROM OPENJSON((SELECT ArrayJSON.[value])) x
    ) Keys
    

    Tabela :

    +----------------------------+
    | JSONValues                 |
    +============================+
    | [{"myKey":1},{"myKey2":2}] |
    +----------------------------+
    | [{"myKey3":3}]             |
    +----------------------------+
    

    Resultado da consulta :

    +--------+
    | Result |
    +========+
    | myKey  |
    +--------+
    | myKey2 |
    +--------+
    | myKey3 |
    +--------+
    
    • 7
  3. renegm
    2021-01-29T15:52:00+08:002021-01-29T15:52:00+08:00

    Usando CTE recursivo para mostrar tudo. Tipo 4 e 5 (resultados da função OPENJSON) são arrays e sub_json respectivamente. Outros tipos são valores atômicos. A consulta retorna caminho completo, valor, chave e tipo de cada elemento na variável json.

    WITH
    T AS (   SELECT CAST(CONCAT ('$', IIF(TRY_CAST([Key] AS int) IS NOT NULL, CONCAT ('[', [Key], ']'), '.' + [Key])) AS nvarchar(MAX)) AS Path
                  , [Key]
                  , Value
                  , Type
                  , 1                                                                                                                   Lvl
             FROM OPENJSON (@json_doc)
             UNION ALL
             SELECT CAST(CONCAT (T.Path, IIF(TRY_CAST(O.[Key] AS int) IS NOT NULL, CONCAT ('[', O.[Key], ']'), '.' + O.[Key])) AS nvarchar(MAX))
                  , O.[Key]
                  , O.Value
                  , O.Type
                  , T.Lvl + 1
             FROM T
                 CROSS APPLY OPENJSON (T.Value) O
             WHERE T.Type IN ( 4, 5 ))
    SELECT Path, T.[Key], T.Value, T.Type, T.Lvl FROM T;
    

    Na pergunta original retornará:

    Path    Key     Value   Type  Lvl
    $.Name1 Name1   Value1  1     1
    $.Name2 Name2   Value2  1     1
    

    Se você usar números como chaves como: SET @json_doc ='{"1":"Value1", "2":"Value2"}'; Os resultados estarão errados:

    Path    Key Value   Type    Lvl
    $[1]    1   Value1  1   1
    $[2]    2   Value2  1   1
    

    O problema aqui é que eu uso IIF(TRY_CAST([Key] AS int) para identificar o índice do array e nenhum item nomeado. Alguns truques podem ser feitos para evitar isso, mas eu não queria complicar demais essa coisa. (E usando números como nomes de chave é uma má idéia na minha opinião. Em um exemplo um pouco mais complicado (de http://www.json.org/example.html )

    DECLARE @json_doc nvarchar(4000) = '{"menu": {
      "id": "file",
      "value": "File",
      "popup": {
        "menuitem": [
          {"value": "New", "onclick": "CreateNewDoc()"},
          {"value": "Open", "onclick": "OpenDoc()"},
          {"value": "Close", "onclick": "CloseDoc()"}
        ]
      }
    }}';
    

    resultados (omitindo o valor por uma questão de clareza):

    Path                               Key       Type     Lvl
    $.menu                             menu      5        1
    $.menu.id                          id        1        2
    $.menu.value                       value     1        2
    $.menu.popup                       popup     5        2
    $.menu.popup.menuitem              menuitem  4        3
    $.menu.popup.menuitem[0]           0         5        4
    $.menu.popup.menuitem[1]           1         5        4
    $.menu.popup.menuitem[2]           2         5        4
    $.menu.popup.menuitem[2].value     value     1        5
    $.menu.popup.menuitem[2].onclick   onclick   1        5
    $.menu.popup.menuitem[1].value     value     1        5
    $.menu.popup.menuitem[1].onclick   onclick   1        5
    $.menu.popup.menuitem[0].value     value     1        5
    $.menu.popup.menuitem[0].onclick   onclick   1        5
    
    • 1

relate perguntas

  • Como alterar as configurações do gerenciador de configuração do servidor SQL usando o TSQL?

  • Como posso obter uma lista de nomes e tipos de coluna de um conjunto de resultados?

  • MS SQL: Use o valor calculado para calcular outros valores

  • Como posso saber se um banco de dados SQL Server ainda está sendo usado?

  • Implementando uma consulta PIVOT

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve