[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