sql - 创建新列,所有内容都在另一列的第三和第四之间
问题描述
我需要根据该列创建一个新列col
,但提取第三-
和第四之间的所有内容-
。例子:
ABC-123-aaa-INEEDTHIS-2000-BBB-123-CCC
111-AAAAA-bb-INEEDTHIS-BB-435-A
如何使用 Big Query 做到这一点?
我正在尝试这样的事情:
SELECT REGEXP_EXTRACT(col, r'\w\w[^\d]\d\d') as newcol from mytable
如果可能的话,我也想了解regex
这个解决方案的背后。
解决方案
以下是 BigQuery 标准 SQL
最简单的方法是使用 SPLIT 函数,如下例所示
SELECT SPLIT(col, '-')[SAFE_OFFSET(3)] AS newcol
如果由于某种原因您想使用正则表达式 - 您可以使用 REGEXP_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
正则表达式的简要说明
[^-]*-
捕获诸如ABC-
,123-
, aaa- 等条目。(?:[^-]*-)
确保不会提取这些条目(?:[^-]*-){3}
确保将跳过前三个此类条目- 最后,
([^-]+)
提取目标片段直到下一个-
推荐阅读
- python - 方法名称未定义错误,即使它在上面在 python 中定义
- firebase - 使用 firebase 云功能删除文件
- php - 在弹出窗口中渲染列表
- android - ListView Flutter 中的文本溢出问题
- go - 如何在另一个文件中访问包 main 的另一个功能?
- c# - Selenium UI 测试通过本地测试但在 VSTS CI 上失败
- laravel - 邮递员:传递 laravel 护照令牌时“无法得到任何响应”
- postgresql - 从没有任何 PID 的 postgres 9.6.6 中删除 pg_lock
- javascript - 如何使用 jquery 验证所需的 Title 字段集?
- javascript - Ext.draw.container 无法在 Ext.JS 6.5.1 和更新版本中加载