在BigQuery中,Excel的“left(find(), - 1)”相当于什么?

时间:2017-10-22 08:49:26

标签: google-bigquery

我的数据集中有名称,它们包括括号。但是,我试图清理名称以排除这些括号。

示例:ABC公司(某处,WY)

我想把它变成:ABC公司

我正在使用google big query的标准SQL。

我做了一些研究,我知道大查询有left(),但我不知道相当于find()。我的计划是做一些找到的东西(然后给我一些左边的-1个字符来自(。

4 个答案:

答案 0 :(得分:3)

只需使用REGEXP_REPLACE + TRIM即可。这适用于所有变体(只是没有嵌套的括号):

#standardSQL
WITH
  names AS (
  SELECT
    'ABC Company  (Somewhere, WY)' AS name
  UNION ALL
  SELECT
    '(Somewhere, WY)  ABC Company' AS name
  UNION ALL
  SELECT
    'ABC (Somewhere, WY) Company' AS name)
SELECT
  TRIM(REGEXP_REPLACE(name,r'\(.*?\)',''), ' ') AS cleaned
FROM
  names

enter image description here

答案 1 :(得分:2)

  

我的计划是做一些找到的东西(然后给我一些左边的-1个字符来自(。

好计划!在BigQuery标准SQL中 - 相当于LEFTSUBSTR(value, position[, length]),相当于FINDSTRPOS(value1, value2)

   

考虑到这一点,您的查询可能看起来像(完全按照您的计划)

#standardSQL
WITH names AS (
  SELECT 'ABC Company (Somewhere, WY)' AS name 
)
SELECT SUBSTR(name, 1, STRPOS(name, '(') - 1) AS clean_name 
FROM names   

通常,字符串函数比正则表达式函数便宜,所以如果你的例子中有模式 - 你应该使用上面的版本

但是在更一般的情况下,当格雷厄姆的答案中清洁模式更具动态性时 - 你应该在格雷厄姆的答案中采用解决方案

答案 2 :(得分:1)

我目前无法测试此解决方案,但您可以将SUBSTR和INSTR结合使用。像这样:

SELECT CASE WHEN INSTR(name, '(') > 0 THEN SUBSTR( name, 1, INSTR(name, '(') ) ELSE name END as name FROM table;

答案 3 :(得分:1)

使用REGEXP_EXTRACT

SELECT
    RTRIM(REGEXP_EXTRACT(names, r'([^(]*)')) AS new_name
FROM yourTable

这里使用的正则表达式将贪婪地消耗并匹配所有内容,直到达到左括号。我使用RTRIM删除了正则表达式拾取的任何不需要的空格。

请注意,对于没有带括号的任何术语的地址记录的边缘情况,这种方法是健壮的。在这种情况下,上面的查询只会返回整个原始值。