本文介绍了雪花SQL正则表达式~提取多个VAL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用雪花regexp_substr()标识嵌套在字符串中的值

我要访问的值在引号中:

...
Type:
  a:
    - !<string>
     val: "A"
    - !<string>
     val: "B"
    - !<string>
     val: "C"
...

*这上面和下面有很多文本。

我要提取所有列的A、B和C。但我不确定是怎么回事。我曾尝试使用regexp_substr(),但未能隔离出第一个值。我已尝试:

REGEXP_SUBSTR(col, 'Type\W+(\w+)\W+\w.+\W+\w.+')

哪个选项产生:

Type: a: - !<string> val: "A"

虽然这给出了字符串的第一部分"A",但我只想要一种分别访问"A"、"B"和"C"的方法。

推荐答案

必须分两个阶段提取值;

  1. 提取以下文档节类型:A:包含所有val: "data"
  2. "data"提取为数组或使用REGEXP_SUBSTR()+indexn提取n元素
SELECT
  'Type:\s+\w+:((\s+- !<string>\s+val:\s+"[^"]")+)' type_section_rx
  REGEXP_SUBSTR(col, type_section_rx, 1, 1, 'i', 1) vals,
  PARSE_JSON('[0' || REPLACE(vals, REGEXP_SUBSTR(vals, '[^"]+'), ', ') || ']') raw_array,
  ARRAY_SLICE(raw_array, 1, ARRAY_SIZE(raw_array)) val_array,
  val_array[1] B
FROM INPUT_STRING

结果是一个数组,您可以在其中使用索引[0]等访问第一个值。
第一个正则表达式可以缩短为"最小工作量"'Type:\s+\w+:(([^"]+"[^"]+")+)'

这篇关于雪花SQL正则表达式~提取多个VAL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-05 08:59