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 / 219735
Accepted
Gerrit
Gerrit
Asked: 2018-10-11 00:13:11 +0800 CST2018-10-11 00:13:11 +0800 CST 2018-10-11 00:13:11 +0800 CST

string_split em várias colunas

  • 772

Desculpe se esta pergunta é muito básica, mas eu simplesmente não consigo descobrir e não consegui encontrar boas respostas.

Eu tenho uma lista muito longa de arquivos, pastas e tamanhos. Preciso separar as pastas para colunas, que tenho uma coluna para cada pasta.

Eu tenho um FilePath como uma String (por exemplo, folder1\folder2\folder3). Eu quero separar isso em várias colunas:

 First  |  Second  |  Third  |  Fourth  |  ...
folder1 | folder2  | folder3 | NULL     | ...
Foldera | folde rb  | folderc | folderd  |

usando cross apply string_split(PATH,'\')como pasta eu recebo Folder1. usando row_Number() eu posso definir qual pasta eu tenho na minha coluna, mas é sempre apenas 1 coluna.

Exemplo real:

select [Parentpath], [Size], [spl].[value] from Files
cross apply string_split([ParentPath], '\') as [spl]


Parentpath                      || Size   ||  Value
Business\Packets\Data\Archive   || 29334  || Business
sql-server t-sql
  • 2 2 respostas
  • 4445 Views

2 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2018-10-11T04:27:59+08:002018-10-11T04:27:59+08:00

    Isso também não é bonito, mas permite tantas\sub\pastas\quanto\você\pode\ter.

    -- borrowing from Brent:
    CREATE TABLE #Files (Parentpath varchar(100), Size int);
    
    INSERT INTO #Files (Parentpath, Size)
      VALUES ('Business\Packets\Data\Archive', 29334),
      ('Coach\Loss\Wharf\Current\Blat\Splunge\More', 7337);
    
    DECLARE @s char(1) = CHAR(92), @sql nvarchar(max) = N'SELECT ParentPath, Size';
    
    SELECT ParentPath, Size, value, rn = ROW_NUMBER() OVER 
      (PARTITION BY ParentPath ORDER BY CHARINDEX(value + @s, ParentPath + @s))
      INTO #x FROM #Files AS f CROSS APPLY STRING_SPLIT(f.ParentPath, @s) AS t;
    
    DECLARE @max int = (SELECT MAX(rn) FROM #x);
    
    SELECT @sql += N',  Folder' + RTRIM(rn) + N' = MAX(CASE WHEN rn = ' 
                +  RTRIM(rn) + N' THEN value END)' 
      FROM (SELECT rn = ROW_NUMBER() OVER (ORDER BY name) FROM sys.all_columns) AS x
      WHERE rn <= @max;
    
    SET @sql += N' FROM #x GROUP BY ParentPath, Size ORDER BY Folder1' 
             +  CASE WHEN @max > 1 THEN N', Folder2' ELSE N'' END + N';';
    
    EXEC sys.sp_executesql @sql;
    
    DROP TABLE #x, #Files;
    

    Com esses dados de exemplo, obtenho os seguintes resultados:

    insira a descrição da imagem aqui

    • 1
  2. Gerrit
    2018-10-11T04:01:05+08:002018-10-11T04:01:05+08:00

    Encontrei uma solução, embora eu não tenha certeza, essa é a melhor maneira de fazê-lo, mas com certeza, essa não é a maneira mais bonita de fazê-lo.

    select x1.value as MainFolder, x2.value as SubFolder, x3.value as [secondSubFolder]
    from Files f 
    cross apply (
    select xx.value, ROW_NUMBER() OVER (Partition by f.ParentPath order by f.ParentPath) AS PP
    from string_split (f.ParentPath,'\') as xx
    ) as x1
    cross apply (
    select xx2.value, ROW_NUMBER() OVER (Partition by f.ParentPath order by f.ParentPath) as PP2
    from string_split (f.ParentPath,'\') as xx2
    ) as x2
    cross apply (
    select xx3.value, ROW_NUMBER() OVER (Partition by f.ParentPath order by f.ParentPath) as PP3
    from string_split (f.ParentPath,'\') as xx3
    ) as x3
    where PP = 1
    and PP2 = 2
    and pp3 = 3
    group by x1.value, x2.value, x3.value
    order by MainFolder asc, SubFolder asc
    

    está me dando: insira a descrição da imagem aqui

    Deixei de fora o Tamanho, pois estava interessado em dividir o Caminho em pastas separadas primeiro.

    Edit: Desculpe, esta captura de tela é diferente da pergunta, devido à classificação dos resultados. Para esclarecer: ParentPath para o resultado exibido seria: "Business Intelligence\GLS Paketdaten \ GLS Daten Archiv"

    Ou como Tabela com conteúdo postado:

    MainFolder      |  SubFolder   |  secondSubfolder
    Business        |   Packets    |      Data 
    

    PS Desculpe, Inglês não é minha primeira língua. Espero ter escrito compreensível.

    • 0

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