簡體   English   中英

如何通過 SQL BigQuery 從長字符串中提取

[英]How to EXTRACT from long string by SQL BigQuery

通過使用SQL的BigQuery(#standardSQL),我想提取0.1e1和0.55e6到另一列轉換數據類型float - > Int64的。

   \nsub_total:\n- !ruby/object:BigDecimal 18:0.1e1\n- !ruby/object:BigDecimal 18:0.55e6\ninvoice_number:\n- \n- '

我的預期:

字符串 | 1 | 550000

使用regexp_extract_all()提取字符串。 然后轉換為浮點數,然后轉換為整數以求和:

select t.*,
       (select sum(cast(cast(val as float64) as int64))
        from unnest(regexp_extract_all(str, '[0-9][.][0-9]*e[0-9]+')) val
       )
from (select '   \nsub_total:\n- !ruby/object:BigDecimal 18:0.1e1\n- !ruby/object:BigDecimal 18:0.55e6\ninvoice_number:\n- \n- ' as str
     ) t;

編輯:

如果要將這些提取到數組中,只需使用:

select t.*,
       (select array_agg(cast(cast(val as float64) as int64))
        from unnest(regexp_extract_all(str, '[0-9][.][0-9]*e[0-9]+')) val
       ) as int_array
from (select '   \nsub_total:\n- !ruby/object:BigDecimal 18:0.1e1\n- !ruby/object:BigDecimal 18:0.55e6\ninvoice_number:\n- \n- ' as str
     ) t

如果您想將它們放在單獨的列中,只需使用數組操作。

編輯:

如果您想要單獨列中的值:

select t.*, ar[safe_ordinal(1)] as col1, 
       ar[safe_ordinal(2)] as col2
from (select t.*,
             array_agg(cast(cast(val as float64) as int64)) as ar
      from (select '   \nsub_total:\n- !ruby/object:BigDecimal 18:0.1e1\n- !ruby/object:BigDecimal 18:0.55e6\ninvoice_number:\n- \n- ' as str
           ) t
     ) t

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM