Sql Google BigQuery:子查询上的迭代包含函数

Sql Google BigQuery:子查询上的迭代包含函数,sql,google-bigquery,contains,Sql,Google Bigquery,Contains,假设我有两个表: girls prefixes ------ ---------- Le-na -na Lo-ve -ve Li-na -la Lu-na -ta Len-ka -ya 所有女孩的名字和前缀都是不同长度的 我想选择所有包含前缀表的女孩姓名,并在QueryMagine中进行选择,因为我有很多姓名和前缀 我未经测试,对于单个案例,它是这样完成的: 选择girls,

假设我有两个表:

girls       prefixes
------     ----------
Le-na          -na      
Lo-ve          -ve
Li-na          -la
Lu-na          -ta
Len-ka         -ya
所有女孩的名字和前缀都是不同长度的

我想选择所有包含前缀表的女孩姓名,并在QueryMagine中进行选择,因为我有很多姓名和前缀

我未经测试,对于单个案例,它是这样完成的:

选择girls,SOMEgirls包含前缀中记录的-na

但如何在子查询上实现CONTAINS函数的迭代呢? e、 g

SELECT girls,SOMEgirls包含SELECT*FROM前缀 在前缀的记录内 –这不起作用,因为SELECT子句中不允许子SELECT

我真的很感激任何想法,我试图寻找这个,但找不到我的案件

你试过只使用join吗


这应该使用标准SQL来实现。

假设前缀、后缀始终为三个字符,则可以使用SUBSTR的结果执行有效的半联接:

或者您可以使用LIKE,但这相当于使用过滤器执行交叉连接,因此速度可能不会那么快:

#standardSQL
WITH Girls AS (
  SELECT name
  FROM UNNEST(['Le-na', 'Lo-ve', 'Li-na', 'Lu-na', 'Len-ka']) AS name 
),
Suffixes AS (
  SELECT suffix
  FROM UNNEST(['-na', '-ve', '-la', '-ta', '-ya']) AS suffix
)
SELECT
  name
FROM Girls
WHERE EXISTS (
  SELECT 1 FROM Suffixes WHERE name LIKE CONCAT('%', suffix)
);
编辑:枚举半联接中使用的所有名称后缀的另一个选项:

#standardSQL
WITH Girls AS (
  SELECT name
  FROM UNNEST(['Le-na', 'Lo-ve-lala', 'Li-na', 'Lu-eya', 'Len-ka']) AS name 
),
Suffixes AS (
  SELECT suffix
  FROM UNNEST(['-na', '-ve', '-lala', '-ta', '-eya']) AS suffix
),
GirlNamePermutations AS (
  SELECT name, SUBSTR(name, LENGTH(name) + 1 - len) AS name_suffix
  FROM Girls
  CROSS JOIN UNNEST(GENERATE_ARRAY(1, (SELECT MAX(LENGTH(suffix)) FROM Suffixes))) AS len
)
SELECT
  name
FROM GirlNamePermutations
WHERE EXISTS (
  SELECT 1
  FROM Suffixes
  WHERE suffix = name_suffix
);
如果您知道后缀长度的范围,可以改为硬编码,例如替换:

CROSS JOIN UNNEST(GENERATE_ARRAY(1, (SELECT MAX(LENGTH(suffix)) FROM Suffixes))) AS len
与:


下面是BigQuery标准SQL

标准SQL 以女孩为中心 选择名称 来自UNNEST['Le-na','love','Li-na','Lu-na','Len-ka']作为名称 , 后缀为 选择后缀 从UNNEST['-na','-ve','-la','-ta','-ya']开始作为后缀 选择名称 来自女孩 连接后缀 在带有名称、后缀的结尾处 作为一个选项,如果您需要扩展它来查找名称内的片段,您可以使用

选择名称 来自女孩 连接后缀 关于REGEXP_CONTAINSname,后缀 或-通过前缀与后缀匹配

选择名称 来自女孩 连接后缀 以名称、后缀开头的
非常感谢你的建议。下面是google bigquery response:ON子句必须是的内容,of=比较每个表中的一个字段名,所有字段名的前缀都是表名。请确保启用,例如,将standardSQL置于查询之前。非常感谢,先生!艾略特,祝你有10/10天和一周!对不起,现在就更新一下。您的假设是不对的,有不同的长度名称和不同的前缀lengthit可以放在'-nenko'上。因此,像联系人“%”一样使用后缀似乎效率很低,因为查询时间超过了300秒,我太累了,无法等待。sql中是否存在可能的包含迭代?
#standardSQL
WITH Girls AS (
  SELECT name
  FROM UNNEST(['Le-na', 'Lo-ve-lala', 'Li-na', 'Lu-eya', 'Len-ka']) AS name 
),
Suffixes AS (
  SELECT suffix
  FROM UNNEST(['-na', '-ve', '-lala', '-ta', '-eya']) AS suffix
),
GirlNamePermutations AS (
  SELECT name, SUBSTR(name, LENGTH(name) + 1 - len) AS name_suffix
  FROM Girls
  CROSS JOIN UNNEST(GENERATE_ARRAY(1, (SELECT MAX(LENGTH(suffix)) FROM Suffixes))) AS len
)
SELECT
  name
FROM GirlNamePermutations
WHERE EXISTS (
  SELECT 1
  FROM Suffixes
  WHERE suffix = name_suffix
);
CROSS JOIN UNNEST(GENERATE_ARRAY(1, (SELECT MAX(LENGTH(suffix)) FROM Suffixes))) AS len
CROSS JOIN UNNEST(GENERATE_ARRAY(1, 5)) AS len