2017-04-26 47 views
0

讓我們假設我有兩個表:谷歌的BigQuery:迭代是函數在子查詢

girls  prefixes 
------  ---------- 
Le-na   -na  
Lo-ve   -ve 
Li-na   -la 
Lu-na   -ta 
Len-ka   -ya 

所有女生的名字和前綴長度不同!

我想要選擇包含前綴表的所有女孩的名字,並在查詢中做到這一點(假設我有很多名字和許多前綴)。

我未經測試,對單情況下,它正在完成這樣的:

SELECT girls,SOME(girls CONTAINS ("-na")) WITHIN RECORD FROM prefixes

但我怎麼實現在子查詢包含函數的迭代? 例如

SELECT girls,SOME(girls CONTAINS (SELECT * FROM prefixes)) WITHIN RECORD FROM prefixes - 這不工作,造成子不能在SELECT子句

我真的很感激任何想法,我試圖尋找這一點,但找不到我的情況下允許的。

回答

3

你剛剛使用過join嗎?

select * 
from girls g join 
    prefixes p 
    on g.girls like concat('%', p.prefix); 

這應該使用標準的SQL。

+0

非常感謝您的建議。以下是google-bigquery響應: ON子句必須是AND表達式=每個表的一個字段名稱的比較,所有字段名稱都以表名爲前綴。' –

+2

確保啓用[標準SQL](https://cloud.google.com/bigquery/docs/reference/standard-sql/),例如通過在查詢之前放置'#standardSQL'。 –

+0

非常感謝,先生! Elliott,祝你有10/10天和一週! –

2

假設前綴(當然,後綴)總是三個字符,您可以執行與SUBSTR結果的有效半連接:

#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 suffix = SUBSTR(name, LENGTH(name) - 2) 
); 

或者你可以使用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) 
); 

編輯:

0:枚舉所有名稱後綴使用的半連接的另一種選擇
#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 
+0

對不起,現在只是有一個更新。你的假設是不正確的,有不同的長度名稱和不同的前綴長度(它可以放在'-nenko'中)。因此,使用'LIKE CONTACT'('%',suffix)'看起來非常低效,因爲查詢時間超過了300秒,我太累等不及了。 也許有可能CONTAINS迭代在SQL? –

+0

看看這個編輯是否有幫助。 –

2

下面是BigQuery的標準SQL

#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 
JOIN suffixes 
ON ENDS_WITH(name, suffix) 

作爲一個選項 - 如果你需要擴展這個裏面找名片段 - 您可以使用REGEXP_CONTAINS

SELECT name 
FROM girls 
JOIN suffixes 
ON REGEXP_CONTAINS(name, suffix) 

或 - STARTS_WITH通過前綴匹配(vs.後綴)

SELECT name 
FROM girls 
JOIN suffixes 
ON STARTS_WITH(name, suffix)