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 / 77362
Accepted
SQLBen
SQLBen
Asked: 2014-09-24 02:42:20 +0800 CST2014-09-24 02:42:20 +0800 CST 2014-09-24 02:42:20 +0800 CST

Extraindo um valor inteiro de uma coluna xml

  • 772

Só estou querendo saber como posso extrair um número inteiro de uma coluna XML. Atualmente, todos os dígitos são 4, o que a consulta abaixo é capaz de fazer. Mas o número vai crescer para 10.000 em breve, o que significará 5 dígitos e esta consulta não será capaz de fazê-lo. Existe alguma maneira de obter dinamicamente qualquer número inteiro que esteja próximo no meio <siteID>e </siteID>da coluna Xml. Qualquer sugestão será muito apreciada.

SELECT 
SUBSTRING(msg, patindex('%[0-9][0-9][0-9][0-9]</siteID>%',msg),4)  AS DOMAIN
FROM table  a(NOLOCK)
WHERE msg like '<DLR%'
ORDER BY 1 DESC
sql-server t-sql
  • 3 3 respostas
  • 11489 Views

3 respostas

  • Voted
  1. Best Answer
    Mikael Eriksson
    2014-09-24T03:35:09+08:002014-09-24T03:35:09+08:00

    Você deve usar o método value() do tipo de dados XML.

    Se sua estrutura XML se parece com isso:

    <DLR>
      <siteID>12345</siteID>
    </DLR>
    

    Sua consulta seria

    select msg.value('(/DLR/siteID/text())[1]', 'int') as DOMAIN
    from dbo.YourTable
    

    Mas, no entanto, não parece que você tenha uma coluna XML, pois msg like '<DLR%'é inválida nas colunas XML.

    Em seguida, você precisa modificar sua tabela para que a coluna seja XML ou pode converter para XML em sua consulta.

    select cast(msg as xml).value('(/DLR/siteID/text())[1]', 'int') as DOMAIN
    from dbo.YourTable
    
    • 5
  2. wBob
    2014-09-25T02:40:53+08:002014-09-25T02:40:53+08:00

    Se seus dados não estiverem tão limpos, a função XQuery fn:number é realmente muito boa para limpá-los para você. Experimente esta demonstração simples:

    IF OBJECT_ID('tempdb..#yourTable') IS NOT NULL DROP TABLE #yourTable
    CREATE TABLE #yourTable ( rowId INT IDENTITY PRIMARY KEY, msg VARCHAR(8000) )
    
    INSERT INTO #yourTable ( msg ) VALUES ( '<DLR_NOTIFICATION><siteid>29   </siteid>trailing tab</DLR_NOTIFICATION>' )
    INSERT INTO #yourTable ( msg ) VALUES ( '<DLR_NOTIFICATION><siteid> 101</siteid>leading tab</DLR_NOTIFICATION>' )
    INSERT INTO #yourTable ( msg ) VALUES ( '<DLR_NOTIFICATION><siteid>
    2001</siteid>carriage return</DLR_NOTIFICATION>' )
    
    INSERT INTO #yourTable ( msg ) VALUES ( '<DLR_NOTIFICATION>
        <kid>204122</kid>
        <siteid> 1234
        </siteid>
        <transid>1************</transid>
        <service>20462</service>
        <mobile>447*******</mobile>
        <msisdntype>IPAlias</msisdntype>
        <operator>
            Three
        </operator>
        <status>100</status>
        <tariff>0000</tariff>
        <billingroute>
            I******
        </billingroute>
        <purpose>IMPULSEPAY DLR NOTIFICATION</purpose>
        <tracking>
            <aff>14_z</aff>
            <param>undefined</param>
            <paramdetails>
                kp=xkpgbadu200000000000000000000000059;
            </paramdetails>
        </tracking>
    </DLR_NOTIFICATION>' )
    
    SELECT s.c.value('fn:number(.)', 'INT' ) AS siteid
    FROM ( SELECT CAST( msg AS XML ) AS msg FROM #yourTable ) a
        CROSS APPLY a.msg.nodes('DLR_NOTIFICATION/siteid') s(c)
    
    • 1
  3. Michael Green
    2014-09-24T03:03:45+08:002014-09-24T03:03:45+08:00

    Se o MS SQL Server for o que você está usando, ele oferece suporte à consulta XPath na instrução SELECT. Veja aqui um exemplo e aqui está uma pergunta SO.

    Isso permitirá que você extraia os numerais de dentro do xml, independentemente de quantos dígitos ele contém. Você pode então CONVERT()fazê-lo intou o que for necessário.

    • 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