sql—创建新列,所有内容都在另一列的第三列和第四列之间

nukf8bse  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(364)

我需要基于该列创建一个新列 col ,但是从第三个 - 第四个呢 - . 示例:
ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC 111-AAAAA-bb-INEEDTHIS-BB-435-A 我怎样才能用大查询做到这一点?
我试着这样做:

SELECT REGEXP_EXTRACT(col, r'\w\w[^\d]\d\d') as newcol from mytable

我也想明白 regex 如果可能的话,在这个解决方案后面。

lrl1mhuk

lrl1mhuk1#

下面是bigquery标准sql
最简单的方法是使用split函数,如下例所示

SELECT SPLIT(col, '-')[SAFE_OFFSET(3)] AS newcol

如果出于某种原因,您想使用正则表达式-您可以使用regexp\u extract,如下例所示

REGEXP_EXTRACT(col, r'(?:[^-]*-){3}([^-]+)') AS newcol

您可以使用问题中的示例数据测试、使用上述两种方法,如下例所示


# standardSQL

WITH `project.dataset.table` AS (
  SELECT 'ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC' col UNION ALL
  SELECT '111-AAAAA-bb-INEEDTHIS-BB-435-A'
)
SELECT 
  col, 
  SPLIT(col, '-')[SAFE_OFFSET(3)] AS newcol_with_split,
  REGEXP_EXTRACT(col, r'(?:[^-]*-){3}([^-]+)') AS newcol_with_regexp
FROM `project.dataset.table`

有输出

Row col                                     newcol_with_split   newcol_with_regexp   
1   ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC  INEEDTHIS           INEEDTHIS    
2   111-AAAAA-bb-INEEDTHIS-BB-435-A         INEEDTHIS           INEEDTHIS

regexp简介 [^-]*- 捕获条目,如 ABC- , 123- ,aaa-等。 (?:[^-]*-) 确保不会提取这些条目 (?:[^-]*-){3} 确保跳过前三个这样的条目
最后, ([^-]+) 提取目标碎片直到下一个 -

相关问题