Eu tenho dados
col1
[{value -> Apple, key -> Fruit}, {value -> White, key -> Colour}]
[{value -> Mango, key -> Fruit}, {value -> Black, key -> Colour}]
e eu queria extrair um valor
value -> White
value -> Black
select col1, instr('key -> Colour' in col1), substr(col1, instr('key -> Colour')
from
(SELECT '[{value -> Apple, key -> Fruit}, {value -> White, key -> Colour}]' as col1 from dual
union all
SELECT '[{value -> Mango, key -> Fruit}, {value -> Black, key -> Colour}]' as col1 from dual
) tbl;
Tentei usar posição e substring, mas não consegui. Qualquer sugestão seria apreciada.
Basicamente, preciso procurar uma chave de valor -> Cor e extrair o valor por substring reversa até { que me dará o valor valor -> Branco e valor -> Preto
Você pode iniciar a pesquisa
value -> <value>
terminando comkey -> Colour
usingREGEXP_SUBSTR
e, em seguida, substituir o,key -> Colour
usingREGEXP_REPLACE
Violino
Se você quiser ser menos dependente da ordem dos pares "k -> v", você precisa ir mais longe na análise sintática com regexp:
Você pode usar
REGEXP_SUBSTR
para encontrar a correspondência:O que, para os dados da amostra:
Saídas:
Alternativamente, não tente codificar seu próprio formato de armazenamento. Se você for usar algo que tenha uma semelhança passageira com o formato JSON, então use o formato JSON em vez de uma aproximação.
Então você pode usar um analisador JSON adequado:
Quais saídas:
ou:
Quais saídas:
violino