在正则表达式中查找字符串的第二次出现(日期)

时间:2018-08-21 14:29:40

标签: sql regex google-bigquery

我得到了以下字符串:

(1640.31; 08/19/2016; 09/13/2016;); (250000.0; 09/30/2016; 02/17/2018;); (100000.0; 03/12/2018; 12/31/2025;);

(1000000.0; 05/30/2018; 06/03/2028;);   

我需要将倒数第二次返回到最后一个日期,因此在这些情况下,例如1:1:03/12/2018和2:2:05/30/2018。

因为有很多以;结尾的字符串部分我无法弄清楚如何才能倒数第二次约会。

2 个答案:

答案 0 :(得分:2)

我认为这可以满足您的要求

select (select array_agg(val order by o desc limit 2)  -- the limit is just for efficiency
        from unnest(split(str, ';')) val with offset o
        where val like '%/%/%'
       )[ordinal(2)] a
from (select '1640.31; 08/19/2016; 09/13/2016;' as str) x;

请注意,如果括号确实是字符串的一部分,则也可以(使用)括号。

答案 1 :(得分:2)

以下BigQuery标准SQL示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '(1640.31; 08/19/2016; 09/13/2016;); (250000.0; 09/30/2016; 02/17/2018;); (100000.0; 03/12/2018; 12/31/2025;);' AS str UNION ALL
  SELECT '(1000000.0; 05/30/2018; 06/03/2028;);'
)
SELECT ARRAY_REVERSE(REGEXP_EXTRACT_ALL(str, r'\d\d/\d\d/\d\d\d\d'))[SAFE_OFFSET(1)] dt
FROM `project.dataset.table`   

结果:

Row dt   
1   03/12/2018   
2   05/30/2018   

注意:以上假设日期始终为mm / dd / yyyy或dd / mm / yyyy格式,但如果不同,则可以进行调整