在第一次出现符号之前从字符串中提取文本

Extracting text from a string before the first occurrence of a symbol

我有如下所示的数据-

type       A_URL                          B_URL             C_URL
A         123.com/123abc?....     123.com/123abc?....       123.com/123abc?....
B         pqr.com/435678?....     pqr.com/435678?....       pqr.com/435678?....
C         lmn.com/12u356?....     lmn.com/12u356?....       lmn.com/12u356?....

我想创建一个新列 URL 并执行以下操作-

如果类型是 A 提取 first '?' 之前的所有内容在 A_URL 列中并将其存储到新列 url,

如果类型是 B 提取 first '?' 之前的所有内容在 B_URL 列中并将其存储到新列 url,

如果类型是 C 提取 first '?' 之前的所有内容在 C_URL 列中并将其存储到新列 url

结果应该如下所示-

type       A_URL                          B_URL             C_URL                     url
A         123.com/123abc?....     123.com/123abc?....       123.com/123abc?....     123.com/123abc?
B         pqr.com/435678?....     pqr.com/435678?....       pqr.com/435678?....     pqr.com/435678?
C         lmn.com/12u356?....     lmn.com/12u356?....       lmn.com/12u356?....     lmn.com/12u356?

注意:虽然 A_URL、B_URL 和 C_URL 在上面看起来一样,但在第一个“?”之后有不同的信息。存储在他们每个人中。

您可以使用 regexp_extract():

select t.*,
       regexp_extract(case when type = 'A' then a_url
                           when type = 'B' then b_url
                           when type = 'C' then c_url
                      end,
                      '^[^?]+'

from t;

编辑:

如果你想保留最后的?,那么使用:

select t.*,
       regexp_extract(case when type = 'A' then a_url
                           when type = 'B' then b_url
                           when type = 'C' then c_url
                      end,
                      '^[^?]+[?]'

from t;

以下适用于 BigQuery 标准 SQL

#standardSQL
SELECT * EXCEPT(url),
  REGEXP_EXTRACT(url, r'^[^?]+\?') AS url
FROM `project.dataset.table`,
UNNEST([CASE type 
  WHEN 'A' THEN A_URL 
  WHEN 'B' THEN B_URL 
  WHEN 'C' THEN C_URL 
END]) url