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 / 68089
Accepted
user2732180
user2732180
Asked: 2014-06-12 17:28:44 +0800 CST2014-06-12 17:28:44 +0800 CST 2014-06-12 17:28:44 +0800 CST

Como usar COALESCE com várias linhas e sem vírgula precedente?

  • 772

Estou tentando alcançar o seguinte:

California | Los Angeles, San Francisco, Sacramento
Florida    | Jacksonville, Miami

Infelizmente, estou recebendo ", Los Angeles, San Francisco, Sacramento, Jacksonville, Miami"

Eu posso alcançar meus resultados desejados usando a função STUFF, mas queria saber se existe uma maneira mais limpa de fazer isso usando COALESCE?

STATE       | CITY
California  | San Francisco
California  | Los Angeles
California  | Sacramento
Florida     | Miami
Florida     | Jacksonville 


DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + city
FROM tbl where city = 'California';
SELECT @col;

Obrigado

sql-server t-sql
  • 2 2 respostas
  • 198142 Views

2 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2014-06-12T18:27:04+08:002014-06-12T18:27:04+08:00

    Esta pode ser a abordagem mais limpa que você procura. Basicamente, verifique se a variável já foi inicializada. Se não tiver, defina-o para a string vazia e anexe a primeira cidade (sem vírgula à esquerda). Se tiver, acrescente uma vírgula e acrescente a cidade.

    DECLARE @col nvarchar(MAX);
    SELECT @col = COALESCE(@col + ',', '') + city
      FROM dbo.tbl WHERE state = 'California';
    

    Claro, isso só funciona para preencher uma variável por estado. Se você estiver puxando a lista para cada estado, um de cada vez, há uma solução melhor de uma só vez:

    SELECT [state], cities = STUFF((
        SELECT N', ' + city FROM dbo.tbl
        WHERE [state] = x.[state]
        FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
    FROM dbo.tbl AS x
    GROUP BY [state]
    ORDER BY [state];
    

    Resultados:

    state       cities
    ----------  --------------------------------------
    California  San Francisco, Los Angeles, Sacramento  
    Florida     Miami, Jacksonville
    

    Para ordenar pelo nome da cidade dentro de cada estado:

    SELECT [state], cities = STUFF((
        SELECT N', ' + city FROM dbo.tbl
        WHERE [state] = x.[state]
        ORDER BY city
        FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
    FROM dbo.tbl AS x
    GROUP BY [state]
    ORDER BY [state];
    

    No Banco de Dados SQL do Azure ou SQL Server 2017+, você pode usar a nova STRING_AGG()função :

    SELECT [state], cities = STRING_AGG(city, N', ')
      FROM dbo.tbl
      GROUP BY [state]
      ORDER BY [state];
    

    E ordenados pelo nome da cidade:

    SELECT [state], cities = STRING_AGG(city, N', ') 
                             WITHIN GROUP (ORDER BY city)
      FROM dbo.tbl
      GROUP BY [state]
      ORDER BY [state];
    
    • 48
  2. ebol2000
    2016-03-19T15:11:48+08:002016-03-19T15:11:48+08:00

    Apenas para adicionar à resposta de Aaron acima ...

    Esteja ciente de que um ORDER BYpode quebrar ao incluir apenas o último item em sua consulta. No meu caso, eu não estava agrupando, então não tenho certeza se isso faz diferença. Estou usando o SQL 2014. No meu caso, tenho algo como valor1, valor2, valor3... mas meu resultado na variável foi apenas valor3.


    Aaron comentou para dizer:

    Isso foi relatado pelo menos quatro vezes no Connect:

    1. Em concatenação de variáveis ​​e ordenação por resultados de filtros (como onde condição)
    2. (n) a construção de varchar do ResultSet falha quando ORDER BY é adicionado
    3. Atribuir uma variável local de um SELECT ordenado com CROSS APPLYs e uma função com valor de tabela retorna apenas o último valor
    4. Ao concatenar valores varchar(max)/nvarchar(max) de uma variável de tabela, resultados incorretos podem ser retornados se filtrar e ordenar por uma coluna de chave não primária

    Exemplo de resposta da Microsoft:

    O comportamento que você está vendo é por design. O uso de operações de atribuição (concatenação neste exemplo) em consultas com a cláusula ORDER BY tem um comportamento indefinido.

    A resposta também faz referência ao KB 287515:

    PRB: Plano de execução e resultados de consultas de concatenação agregada dependem da localização da expressão

    A solução é usar FOR XML PATH(a segunda abordagem na resposta de Aaron) se a ordem de concatenação for importante e, é claro, se você quiser incluir todos os valores. Veja também:

    Concatenação de nvarchar / índice / comportamento inexplicável de nvarchar (max) no Stack Overflow

    • 8

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

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