Google bigquery 如何使用regex extract获取特定字符之间的文本?

Google bigquery 如何使用regex extract获取特定字符之间的文本?,google-bigquery,Google Bigquery,我目前正在尝试不同类型的正则表达式提取公式,试图充分理解它。下面是我正在使用的数据和当前代码的示例,我正在使用这些代码获取我需要的内容。请批评我的代码,如果它可以写得更好,因为我仍然在学习正则表达式摘录 Sample_Data AAAA;BBBB;CCCC;A1=1234;DDDD;EEEE FFFF;GGGG;A1=2345;A2=4567,2345;RRRR;KKKK SSSS;TTTT;UUUU;VVVV;A1=3456;GGGG;UUUU UUUU:WWWW;QQQQ;IIII;A1=9

我目前正在尝试不同类型的正则表达式提取公式,试图充分理解它。下面是我正在使用的数据和当前代码的示例,我正在使用这些代码获取我需要的内容。请批评我的代码,如果它可以写得更好,因为我仍然在学习正则表达式摘录

Sample_Data
AAAA;BBBB;CCCC;A1=1234;DDDD;EEEE
FFFF;GGGG;A1=2345;A2=4567,2345;RRRR;KKKK
SSSS;TTTT;UUUU;VVVV;A1=3456;GGGG;UUUU
UUUU:WWWW;QQQQ;IIII;A1=9876;A2=7654,7890;UUUU
我目前拥有的代码是:

SELECT
 REGEXP_EXTRACT(Sample_Data, r'(?:^|;)A1=(\d*)') AS A1,
 REGEXP_EXTRACT(Sample_Date, r'(?:^|;)A2=(\d*)(?:;)') AS A2,
 SPLIT(REGEXP_EXTRACT(Sample_Data, r'(?:^|;)A2=(\d*\,\d*)(?:;)'), ",")[offset(1)] AS A2_v1
FROM
 db.Sample
我得到的结果是:

  A1    |   A2    |  A2_v1
1234    |  NULL   |  NULL
2345    |  4567   |  2345
3456    |  NULL   |  NULL
9876    |  7654   |  7890
对于输出,这是我所期望的。但是,正如您在输出第2行中看到的,我有几个不同的问题:

2345  |  4567  |  2345
它有2345两次,有没有办法让它只显示2345一次,比如:

2345  |  4567  |  NULL
我的思考过程是在什么时候有一个案例,让它检查REGEXP\u EXTRACT公式,看看它们是否匹配,以及它们是否抛出空值。有没有更好的方法,或者这是最好的结果

我的第二个问题是,假设我们有以下样本数据:

AAAA;GGGG;DDDD;A1=1234;A2=7890,1234,3456;DDDD
BBBB;DDDD;CCCC;FFFF;A1=2345;A2=8907,1234,4567,8976;WWWW;GGGG
CCCC;EEEE;A1=6789;A2=34567,8901,3456,12345;TTTT
根据我现有的公式,只能得到A1和A2的一部分。但是,我如何将公式转换为能够提取所有以、?分隔的数字,?我期待的最终结果如下:

  A1  |  A2  |  A2_v1 | A2_v2 | A2_v3
 1234 | 7890 |  1234  | 3456  | NULL
 2345 | 8907 |  1234  | 4567  | 8976
 6789 | 34567|  8901  | 3456  | 12345
我怎样才能使它正常工作?它是否是以下内容的变体:

SPLIT(REGEXP_EXTRACT(Sample_Data, r'(?:^|;)A2=(\d*\,\d*)(?:;)'), ",")[offset(1)] AS A2_v1
有不同的偏移量吗?还是有一种不同的公式可以做到这一点


任何帮助都将不胜感激

为了避免重复这些数字,我认为你对案件的看法。。。什么时候是一个好方法。在这种情况下,可以使用作为速记。通过使原始查询成为子查询,比较值更容易

对于A2,在REGEXP_中提取您,因此可以通过在regex中更宽松的方式捕获完整数字。例如,正则表达式使用:

'A2=[\d,]*'

还将匹配以下表达式:A2=1,2,3,4,5,这在您的场景中可能是允许的,也可能是不允许的。正则表达式可以进行改进,以完全匹配您所寻找的内容;然而,它将需要更长的时间,或者,它将需要使用超过匹配组。例如:

'A2=\d{4},+'

此正则表达式将匹配一个或多个由四个数字后跟零或一个逗号组成的序列。要使用这个正则表达式,您可以改为使用,并在删除所有其他内容的同时保留所需的部分。然而,这种方法似乎使事情复杂化而不是简单化

最后,由于数组中的值的数量可能会改变,我建议使用访问数组值,因为每当出现索引超出范围错误时,这将返回空值

您可以使用以下SQL查询作为参考:

选择 A1, 如果2[SAFE_OFFSET0]=A1,则为空,A2[SAFE_OFFSET0]为A2, 如果2[SAFE_OFFSET1]=A1,空,A2[SAFE_OFFSET1]作为A2_V1, 如果2[SAFE_OFFSET2]=A1,空,A2[SAFE_OFFSET2]作为A2_v2, IFA2[SAFE_OFFSET3]=A1,空,A2[SAFE_OFFSET3]作为A2_v3 从…起 选择 REGEXP_提取样本_数据,r'A1=\d{4}作为A1, SPLITREGEXP_EXTRACTSample_数据,r'A2=[\d,]*',作为A2 从…起 选择“BBBB”;DDDD;中交;FFFF;A1=2345;A2=8907123445672345;WW;GGGG'作为样本_数据 联合所有 选择“中交”;EEEE;A1=6789;TTTT'作为样本数据
预期的列数是否固定?因为如果不是这样的话,我认为最好选择一个记录或数组,而不是每个记录或数组对应一列result@Tlaquetzal是的,这将是一个固定数量的列,因此最大列数将为5。