Sql 如何查看表中的字符串是否包含在其他表中指定的字符串

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 .. 对于“查询”表中的每个字符串,我

我一直在为下面的问题绞尽脑汁。我有两个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                    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)])
如果要应用于问题中的样本数据,则输出为