4

我在 BigQuery 查询参考中找不到一个函数,该函数在第二个字符串中查找一个字符串并返回该位置的索引。类似于其他 SQL 方言中的 instr() 。是否有任何替代品或任何技术来实现这一目标?

例如:在“abcdef”中查看“de”将返回 4。

4

4 回答 4

6

一种方法是使用正则表达式提取(请参阅此处的参考资料):

SELECT
  title, LENGTH(REGEXP_EXTRACT(title, r'^(.*)def.*')) + 1 AS location_of_fragment
FROM
  [publicdata:samples.wikipedia]
WHERE
  REGEXP_MATCH(title, r'^(.*)def.*')
LIMIT 10;

回报:

Row title   location_of_fragment     
1   Austrian air defense    14   
2   Talk:Interface defeat   16   
3   High-definition television  6    
4   Talk:IAU definition of planet   10   
5   Wikipedia:Articles for deletion/Culture defines politics    41   
6   Wikipedia:WikiProject Spam/LinkReports/defenders.org    40   
7   Adenine phosphoribosyltransferase deficiency    35   
8   Stay-at-home defenceman 14   
9   Manganese deficiency (plant)    11   
10  High-definition television  6   
于 2013-04-23T16:45:06.170 回答
3

旧答案现已弃用,@carlos 答案有效:

STRPOS(string, substring) 
于 2020-06-14T03:06:59.567 回答
2

旧版 SQL INSTR(str1,str2) 函数“返回字符串第一次出现的从 1 开始的索引。” 所以这应该对你有用。

https://cloud.google.com/bigquery/docs/reference/legacy-sql

于 2018-01-10T17:39:47.477 回答
0

我迟到了,但 BigQuery API 发生了变化,现在正则表达式语法如下:

SELECT mydomains FROM `myproject.mydataset.mytable`
       where regexp_contains(mydomains, r'^(.*)example.*');

要回答这个问题,例如:在 "abcdef" 中查看 "de" 将返回 4.,它看起来像:

SELECT de FROM `myproject.mydataset.mytable`
       where regexp_contains(de, r'^(.*)abcdef.*');

根据参考链接,REGEXP_MATCH 现在是旧版 SQL 函数和运算符的一部分。

希望它可以帮助一个!:)

于 2021-04-19T16:34:18.533 回答