Sql 如何查看表中的字符串是否包含在其他表中指定的字符串
我一直在为下面的问题绞尽脑汁。我有两个BigQuery表,一个表包含大约300万个搜索词:Sql 如何查看表中的字符串是否包含在其他表中指定的字符串,sql,google-bigquery,Sql,Google Bigquery,我一直在为下面的问题绞尽脑汁。我有两个BigQuery表,一个表包含大约300万个搜索词: search_term number of people named joe how to paint a table black top 100 pop songs lovely horses .. 以及8000个“关键词”的列表。关键字表中的每一行都是一些单词 keyword name joe horses baby kitten song top 100 .. 对于“查询”表中的每个字符串,我
search_term
number of people named joe
how to paint a table black
top 100 pop songs
lovely horses
..
以及8000个“关键词”的列表。关键字表中的每一行都是一些单词
keyword
name joe
horses
baby kitten
song top 100
..
对于“查询”表中的每个字符串,我想检查它是否包含“关键字”表中的任何单词。但是,关键字在“查询”字符串中的显示顺序并不重要,其间可能有其他单词。这是我要查找的结果表:
search term contains_keywords
number of people named joe TRUE
how to paint a table black FALSE
top 100 pop songs TRUE
lovely horses TRUE
..
我编写了以下代码来检查每个搜索词(作为一个整体)是否完全匹配一个关键字,但我不知道如何拆分关键字,然后检查每个查询是否包含这些关键字。这是到目前为止我所拥有的代码,但我非常感谢任何帮助或正确方向的指点
SELECT
*
, CASE
WHEN search_term IN (
SELECT
keyword
FROM
keywords)
THEN true
ELSE false
END AS contains_keyword
FROM search_terms
编辑:我提供了上面两个示例表,以使您更容易尝试自己的代码
WITH
search_terms AS (
SELECT 'number of people named joe' AS search_term UNION ALL
SELECT 'how to paint a table black' AS search_term UNION ALL
SELECT 'top 100 pop songs' AS search_term UNION ALL
SELECT 'lovely horses' AS search_term
)
,keywords AS (
SELECT 'name joe' AS keyword UNION ALL
SELECT 'horses lovely' AS keyword UNION ALL
SELECT 'baby kitten' AS keyword UNION ALL
SELECT 'song top 100' AS keyword
)
SELECT * FROM search_terms
您可以使用正则表达式:
SELECT st.*,
regexp_contains(search_term, k.pattern)
FROM search_terms st cross join
(select string_agg(replace(keyword, ' ', '|'), '|') as pattern
from keywords
) k;
这会将所有关键字转换为一个正则表达式,字符串之间用“
|
”分隔,即regexp表示“或”。下面是用于BigQuery标准SQL的
使用由8000多个单词组成的正则表达式模式-可能会占用大量资源下面是解决方法
#standardSQL
SELECT search_term,
( SELECT COUNT(1)
FROM UNNEST(SPLIT(search_term, ' ')) word
JOIN UNNEST(keywords) word
USING(word)
) > 0 AS contains_keyword
FROM `project.dataset.search_terms`,
UNNEST([STRUCT(ARRAY(
SELECT DISTINCT keyword
FROM `project.dataset.keywords`, UNNEST(SPLIT(keyword, ' ')) keyword
) AS keywords)])
如果要应用于问题中的样本数据,则输出为