我的数据集中有名称,它们包括括号。但是,我试图清理名称以排除这些括号。
示例:ABC公司(某处,WY)
我想把它变成:ABC公司
我正在使用google big query的标准SQL。
我做了一些研究,我知道大查询有left()
,但我不知道相当于find()
。我的计划是做一些找到的东西(然后给我一些左边的-1个字符来自(。
答案 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
答案 1 :(得分:2)
我的计划是做一些找到的东西(然后给我一些左边的-1个字符来自(。
好计划!在BigQuery标准SQL中 - 相当于LEFT
为SUBSTR(value, position[, length])
,相当于FIND
为STRPOS(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
删除了正则表达式拾取的任何不需要的空格。
请注意,对于没有带括号的任何术语的地址记录的边缘情况,这种方法是健壮的。在这种情况下,上面的查询只会返回整个原始值。