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 / 250599
Accepted
Lava Viperidae
Lava Viperidae
Asked: 2019-10-09 15:19:48 +0800 CST2019-10-09 15:19:48 +0800 CST 2019-10-09 15:19:48 +0800 CST

Se o valor do elemento filho XML contiver string, retorne outro valor do elemento filho no mesmo nível

  • 772

Eu tenho uma tabela de banco de dados chamada Warehouses que contém linhas de dados relacionados a armazéns específicos. Uma coluna nessa tabela é denominada itemStats e contém dados XML no seguinte formato:

<itemStats xmlns="http://www.blahblahblah.com/blah">
  <itemCounts>
    <item>
      <name>Toaster Oven Device</name>
      <count>6</count>
    </item>
    <item>
      <name>Washing Machine</name>
      <count>2</count>
    </item>
    <item>
      <name>Microwave Oven</name>
      <count>4</count>
    </item>
  </itemCounts>

Gostaria de consultar a tabela para verificar nessa coluna em cada linha a existência de alguma string (exemplo: Forno) e se encontrar, retornar a contagem associada a ela. Portanto, se eu tivesse os dados acima em itemStats para uma determinada linha em Warehouses , gostaria que ele retornasse o seguinte junto com outras correspondências de outras linhas:

Name                Count
=========================
Toaster Oven Device     6
Microwave Oven          4

Eu tentei várias vezes usando SQL value() e nodes(), mas estou tendo problemas para produzir os resultados desejados. Eu sei que o [1] está errado na consulta abaixo, mas não tenho certeza de como fazer referência a um local dinâmico:

;WITH XMLNAMESPACES (N'http://www.blahblahblah.com/blah' as X)
SELECT itemStats.value('(/X:itemStats/X:itemCounts/X:item/X:name)[1]', 'nvarchar(max)') as Name,
       itemStats.value('(/X:itemStats/X:itemCounts/X:item/X:count)[1]', 'int') as Count
FROM Warehouses
WHERE itemStats.exist('(/X:itemStats/X:itemCounts/X:item/X:name[contains(., "Oven")])') = 1
sql-server-2012 xml
  • 1 1 respostas
  • 324 Views

1 respostas

  • Voted
  1. Best Answer
    Mikael Eriksson
    2019-10-09T21:28:00+08:002019-10-09T21:28:00+08:00

    Use nodes()e value()para obter os nomes e a contagem em uma tabela derivada e filtre suas linhas na consulta principal.

    declare @T table(itemStates xml not null);
    
    insert into @T (itemStates)
    values ('<itemStats xmlns="http://www.blahblahblah.com/blah">
               <itemCounts>
                 <item>
                   <name>Toaster Oven Device</name>
                   <count>6</count>
                 </item>
                 <item>
                   <name>Washing Machine</name>
                   <count>2</count>
                 </item>
                 <item>
                   <name>Microwave Oven</name>
                   <count>4</count>
                 </item>
               </itemCounts>
             </itemStats>');
    
    with xmlnamespaces(default 'http://www.blahblahblah.com/blah')
    select T.Name,
           T.Count
    from (
         select I.X.value('(name/text())[1]', 'nvarchar(max)') as Name,
                I.X.value('(count/text())[1]', 'int') as Count
         from @T as T
           cross apply T.itemStates.nodes('/itemStats/itemCounts/item') as I(X)
         ) as T
    where T.Name like '%Oven%';
    
    • 0

relate perguntas

  • Selecione valores XML quando o atributo estiver envolvido

  • Por que as sequências Denali devem ter um desempenho melhor do que as colunas de identidade?

  • Como inserir vários registros usando XML no SQL Server 2008

  • O SQL Server não deveria oferecer suporte a RANGE?

  • O que é SQL Server "Denali"? O que há de novo?

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