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 / 192208
Accepted
johnny
johnny
Asked: 2017-12-02 12:44:20 +0800 CST2017-12-02 12:44:20 +0800 CST 2017-12-02 12:44:20 +0800 CST

MySQL: retorne JSON de uma consulta SQL padrão

  • 772

Eu li sobre objetos JSON e o tipo de objeto JSON. Eu só quero fazer um select e ele retornar JSON. Não quero necessariamente armazenar um objeto JSON. Serialização em si, não é minha pergunta. As colunas são colunas regulares Varchar, Int, etc., sem objetos JSON, linhas de banco de dados "normais".

Posso fazer um SELECT antigo regular e retornar JSON para MySQL?

Não é isso que FOR JSON no SQL SERVER e rows_for_json fazem no PostgreSQL?

Eles pareciam à frente neste são, mas eu não queria me enganar.

Encontrei esta pergunta de 2016: https://stackoverflow.com/questions/35324795/mysql-5-7-return-row-as-json-using-new-json-features

mysql json
  • 5 5 respostas
  • 96468 Views

5 respostas

  • Voted
  1. Evan Carroll
    2017-12-05T23:23:41+08:002017-12-05T23:23:41+08:00

    Convertendo uma linha para json

    Não me parece que você queira agregar JSON. Você afirma que deseja o equivalente a row_to_json, se sim, sugiro verificar o muito mais simplesJSON_OBJECT

    SELECT JSON_OBJECT(
      'name_field', name_field,
      'address_field', address_field,
      'contact_age', contact_age
    )
    FROM contact;
    

    Agregando JSON

    Como observação lateral, se você precisar agregar um conjunto de resultados ao json. então o próximo MySQL 8 fará isso por você.

    • JSON_ARRAYAGG() Retorne o conjunto de resultados como uma única matriz JSON
    • JSON_OBJECTAGG()` Retorna o conjunto de resultados como um único objeto JSON
    • 23
  2. Best Answer
    Vérace
    2017-12-03T05:46:32+08:002017-12-03T05:46:32+08:00

    Demorei um pouco para entender (mais acostumado com PostgreSQL onde as coisas são muito mais fáceis !), mas se você consultar o bom manual aqui , em 12.16.2 Functions That Create JSON Values, tem a JSON_ARRAYfunção, mas não é muito útil realmente - pelo menos neste caso!

    Para responder à pergunta "select and it return JSON", existem duas maneiras de fazer isso, ambas bastante dolorosas!

    Você também pode

    • use um "hack" - veja o db-fiddle aqui ,

    • ou use uma das novas funções JSON fornecidas pelo MySQL aqui - que, ironicamente, parece ser ainda mais um hack do que o próprio hack! Só com MySQL! :-) (violino aqui ).

    Ambas as respostas usam a GROUP_CONCATfunção MySQL - este post ajudou. Você pode querer definir a variável de sistema group_concat_max_len para um pouco mais do que seu padrão (um insignificante 1024)!

    A primeira consulta é, como você pode imaginar, confusa ( DDLe DMLna parte inferior desta resposta):

    SELECT CONCAT('[', better_result, ']') AS best_result FROM
    (
    SELECT GROUP_CONCAT('{', my_json, '}' SEPARATOR ',') AS better_result FROM
    (
      SELECT 
        CONCAT
        (
          '"name_field":'   , '"', name_field   , '"', ',' 
          '"address_field":', '"', address_field, '"', ','
          '"contact_age":'  , contact_age
        ) AS my_json
      FROM contact
    ) AS more_json
    ) AS yet_more_json;
    

    Resultado:

    [{"name_field":"Mary","address_field":"address one","contact_age":25},{"name_field":"Fred","address_field":"address two","contact_age":35},{"name_field":"Bill","address_field":"address three","contact_age":47}]
    

    o que está correto, mas, convenhamos, um pesadelo!

    Depois, há a JSON_ARRAY()abordagem MySQL (que é ainda mais confusa - obrigado MySQL por sua implementação (inexistente) da TRANSLATE()função!).

    SELECT
    CONCAT
    ('[', REPLACE
      (
        REPLACE
        (
          GROUP_CONCAT
          (
            JSON_ARRAY
            (
              'name_field:', name_field, 
              'address_field:', address_field, 
              'age_field:', contact_age
            ) SEPARATOR ','
          ), '[', '{'
        ), ']', '}'
      ), ']'
    ) 
    AS best_result2 
    FROM contact
    

    Mesmo resultado!

    ====  TABLE CREATION and INSERT DDL and DML ============
    
        CREATE TABLE contact
        (
             name_field VARCHAR  (5) NOT NULL,
          address_field VARCHAR (20) NOT NULL,
          contact_age   INTEGER      NOT NULL
        );
    
        INSERT INTO contact
        VALUES
        ('Mary', 'address one',   25),
        ('Fred', 'address two',   35),
        ('Bill', 'address three', 47);
    
    • 17
  3. Eneko Alonso
    2019-03-24T16:10:09+08:002019-03-24T16:10:09+08:00

    Para uma matriz de objetos JSON (um objeto por linha na consulta), você pode fazer isso:

    SELECT JSON_ARRAYAGG(JSON_OBJECT("fieldA", fieldA, "fieldB", fieldB)) 
      FROM table;
    

    Isso resultaria em uma única matriz JSON contendo todas as entradas:

    [
      {
        "fieldA": "value",
        "fieldB": "value"
      },
      ...
    ]
    

    Infelizmente, o MySQL não permite selecionar todos os campos com *. Isso seria incrível, mas não funciona:

    SELECT JSON_ARRAYAGG(JSON_OBJECT(*)) FROM table;
    
    • 8
  4. dmelt
    2019-02-08T07:23:31+08:002019-02-08T07:23:31+08:00

    Isso lhe dará a mesma resposta, mas um código muito mais fácil. Eu apenas usei json_objectcom group_concatpara simplificar a outra resposta .

    select 
        concat('[',
            GROUP_CONCAT(
                JSON_OBJECT(    
                    'name_field', name_field
                    ,'address_field', address_field
                    ,'contact_age', contact_age
                    )
                SEPARATOR ',')
        ,']')
        from contact;
    
    • 5
  5. outis
    2021-11-06T14:56:43+08:002021-11-06T14:56:43+08:00

    Se você não deseja fazer isso no contexto de nenhum ambiente de host específico (por exemplo, node.js, Python, MySQL Workbench), o MySQL Shell oferece suporte à saída JSON . Cada linha em um resultado é gerada como um objeto separado. Ele pode imprimir uma saída bonita e pode gerar uma matriz de objetos ou separar cada linha com novas linhas. Por exemplo, no prompt do shell, digite:

    \option resultFormat json/array
    

    Em seguida, execute uma consulta normalmente.

    SELECT * FROM contacts;
    

    Como bônus, o MySQL Shell também suporta JavaScript e Python, embora você só possa se livrar de instruções SQL se o servidor estiver configurado como um armazenamento de documentos . Então, depois de definir o esquema ativo, você pode acessar as tabelas relacionais por meio do dbobjeto. Seja usando JS ou Python, a instrução correspondente à consulta SQL acima é a mesma:

    \use people
    db.contacts.find()
    
    • 0

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

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