Regex case和ifnull语句-有人能解释下面的代码吗
谁能解释一下下面的代码。我需要修改它,但在做之前,我想清楚地理解它Regex case和ifnull语句-有人能解释下面的代码吗,regex,google-bigquery,Regex,Google Bigquery,谁能解释一下下面的代码。我需要修改它,但在做之前,我想清楚地理解它 CASE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown') WHEN 'BB' THEN 'BUS' WHEN 'MB' THEN 'MIG' ELSE IFNULL(UP
CASE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown')
WHEN 'BB' THEN 'BUS'
WHEN 'MB' THEN 'MIG'
ELSE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown')
END
希望下面的例子能让你明白
#standardSQL
WITH example AS (
SELECT 'ab-BB-asd' title UNION ALL
SELECT 'new1ab-BB-asd' UNION ALL
SELECT 'xyz-mb-12345' UNION ALL
SELECT 'abcd-mb -sss'
)
SELECT title,
CASE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown')
WHEN 'BB' THEN 'BUS'
WHEN 'MB' THEN 'MIG'
ELSE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown')
END result
FROM example
结果
Row title result
1 ab-BB-asd BUS
2 new1ab-BB-asd BUS
3 xyz-mb-12345 MIG
4 abcd-mb -sss Unknown
正如您在这里看到的,CASE语句从title中提取特定的模式,如果找不到,则为其分配“Unknown”
然后,如果提取的值分别为“BB”或“MB”,则两个When输出“BUS”或“MIG”,否则输出在ELSE中计算的值(在本例中与在本例中完全相同)
现在,关于regexp_EXTRACT(title,(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)中的提取模式/regexp
首先,它使搜索不区分大小写?i:
然后,它从标题的开头查看可选文本(?:new[^a-z])?
,后跟任何一个非字母字符。可选,因为关闭括号后的?
)由于
(?:…)
构造,它被跳过(未提取)
然后,它查找两个或三个{2,3}
字母字符[a-z]
-由于(?:…)
而被跳过(未提取)的字符
在此之后,代码在-
之间寻找另外两个或三个字母字符,由-([a-z]{2,3})
表示,最后是被提取的字符
这就是它的全部功能:o)谢谢米哈利。你帮了我很多。只有一个问题,对于第四个标题,尽管标题中有mb,为什么结果显示为“未知”。这是因为
d
在abc
之后-它应该是一个非字母字符。那么第2行呢。这是newlab-BB。它不是字母l
,而是数字1
:o)