Consulta SQL - Desmembrar String

7 respostas
Jauns

Boa noite.

Preciso de uma ajuda, para devidos fins, faz necessário desmembrar uma String em uma consulta, fazer em java foi fácil o problema é jogar no SQL.

Cod…|…Descricao…|…Pagamento
01…|…3x…|…30,90,120
02…|…2x…|…00,30

retorno teria que ser…

Descricao…|…Pagamento
3x…|…30
3x…|…90
3x…|…120
2x…|…00
2x…|…30

Em java resolvi da seguinte forma…

public class teste {
    public static void main(String[] args) {

        String forma = "10,20,30,40,50,60,70,80,90,100,110,120,130,140";

        int inicio = 0;

        for (int cont = 0; cont < forma.length(); cont++) {

            if (forma.substring(cont, cont + 1).equals(",")) {
                System.out.println(forma.substring(inicio, cont));
                inicio = cont + 1;
            }
        }
        System.out.println(forma.substring(inicio, forma.length()));

    }
}

7 Respostas

A

Essa é meio cabeluda mesmo… em que banco está isso?

C

Não entendi o que você quer,
pelo visto seu banco não está normalizado, é isso?

Jauns

Boa noite, desde já agradeço o interesse.

O Banco é SQL Server 2008.

Jauns

cfred:
Não entendi o que você quer,
pelo visto seu banco não está normalizado, é isso?

Boa noite, obrigado pelo interesse.

Sim, o banco esta normalizado,

O problema é o seguinte.

Essa consulta fara parte de um Resumo Financeiro, onde apos ter sido montada uma carga de entrega, o sistema ira emitir 2 relatorio, o 1 é a um relatorio simples com os produtos aglutinados.

o 2 a qual essa sentença fara parte seria do Resumo financeiro, onde é necessario sair no relatorio o nome , data emissao, valor parcela ( se for parcelado), e o vencimento da parcela.

O sistema já trata esta data de vencimento, so que trata somente apos o pedido ser faturado, e no caso deste relatorio (necessidade do cliente) ele sai antes de ser faturado, porem o mesmo precisa destas datas de vencimento. e a tabela que traz a forma de pagamento, traz somente como “00,30,60, etc…”

dai a necessidade de desmembrar o campo, pois preciso saber qtos dias acrescentar a data de emissao para virar a data de vencimento (particularidades do cliente).

jamirdeajr

Sendo SQLServer 2008 tem um exemplo aqui muito próximo da sua necessidade:
[url]http://www.kodyaz.com/articles//t-sql-convert-split-delimeted-string-as-rows-using-xml.aspx[/url]
Tem duas versões, uma 'inline' e outra criando uma função. Internamente elas usam XML (ou seja, cabeludas mesmo!)

Função Split, créditos do site Kodyaz:
CREATE FUNCTION Split
(
  @delimited nvarchar(max),
  @delimiter nvarchar(100)
) RETURNS @t TABLE
(
-- Coluna Id pode ser comentada, não necessária para fazer o split na string
  id int identity(1,1), -- Eu usei esta coluna para numerar as partes 'splitted'
  val nvarchar(max)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select
    r.value('.','varchar(5)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END
GO

SELECT * FROM dbo.Split(N'a,b,c,d,e', ',')
Adaptando de forma livre, supondo que FormasPgto é sua tabela principal e Prazos é uma tabela com todos os números de dias possíveis 30,60,90,00 etc... (essa acho que você terá que criar)
SELECT
  FormasPgto.Descricao, Prazos.ndias
FROM FormasPgto
CROSS APPLY dbo.split(FormasPgto.Pagamento,',') split
INNER JOIN Prazos ON Prazos.ndias = split.val
Jauns

Muito obrigado pela atenção, vou efetuar teste e amanha postarei o resultado.

A

rsrsrs

Essa solução parece mesmo atender. Lembra bem uma coisa que fiz em Oracle uma vez, que usa uma parada chamada “função pipelined”.

Sucesso aí, e, como o pessoal do fórum gosta de recomendar, coloque [RESOLVIDO] no título do post se tiver dado certo.

Criado 28 de abril de 2011
Ultima resposta 29 de abr. de 2011
Respostas 7
Participantes 4