[firebase-br] Select com expresao regular

Rodrigo Gomes da Silva rodrgomes em gmail.com
Seg Set 23 17:29:15 -03 2013


Pode usar CTE


with recursive
  split as (
    select campo_chave,
           substring(trim(coluna)||';' from 1 for position(';',
trim(coluna)||';')-1) parte,
           substring(trim(coluna)||';' from position(';', trim(coluna)||';'
)+1 for 1000) texto,
           1 nivel
    from tabela
    union all
    select d.campo_chave,
           substring(h.texto from 1 for position(';', h.texto)-1),
           substring(h.texto from position(';', h.texto)+1 for 1000),
           h.nivel+1
    from tabela d
         join split h on h.campo_chave=d.campo_chave
    where position(';', h.texto)<>0
  )

select
 campo_chave, nivel,  parte
from split x
where (campo_chave= :filtro)


O trim pode ser removido se o campo for varchar.
Se vc quizer usar mais filtros sem ser a pk, pode colocar eles na lista de
campos "exportados" nas sentencas acima e usar o filtro no where abaixo

Do exemplo q colocou, o 1o resultado ficaria com o select "select parte
from split x where nivel=2", e o segundo agrupando com group by + count.
Isto roda apartir do 2.1.


Rodrigo


Em 23 de setembro de 2013 14:46, Marcelo Moreira <
marcelomoreira.souza em gmail.com> escreveu:

> Pessoal,
>
> Firebird 2.5
>
> É possivel fazer um select usando expressao regular? Tenho uma coluna na
> tabela onde as informacoes ficam mais ou menos assim, separadas por ponto e
> virgula:
>
> 'A;A;B;A;C'
> 'A;E;B;A;C'
> 'A;F;B;A;C'
> 'A;F;B;A;C'
> 'A;F;B;A;C'
> 'A;C;B;A;C'
>
> Preciso fazer um select na tabela apresentando apenas um pedaço desta
> string no resultado. E depois fazer um agrupamento. Por isso pensei em
> expressao regular.
>
> Neste exemplo ai acima precisava retornar algo assim: Quero considerar
> todos os valores apenas da segunda posicao. entao eu teria:
>
> A
> E
> F
> F
> F
> C
>
> AGRUPANDO:
>
> A - 1
> E - 1
> F - 3
> C - 1
>
>
>
>



Mais detalhes sobre a lista de discussão lista