2017-03-06 18 views
0

我試圖使用不含有(正則表達式)查詢重複的場否定不包括

這是查詢,其中暱稱是一個數組查詢字符串重複場(重複)的字符串:

SELECT 
    name 
    FROM 
    [mytable] 
    WHERE 
    (NOT REGEXP_MATCH (nickname, '(query)')) 

問題是,當用戶有下綽號至少兩個值,他們就會如果我使用查詢返回NOT

爲: NOT REGEXP_MATCH(綽號「(喬尼)」)

name  nickname 

john [johhny,jonny] 
jon  [jonny] 

將返回約翰,它不應該。

+0

你有錯誤的數據模型。您可以將值存儲在數組中或單獨的表中,每個暱稱有一行。不要試圖做這個工作。修復數據模型。 –

+0

無法修復數據模型。這是查詢如何保持數據。這不是mysql。 –

+0

。 。 BigQuery提供數組和'JOIN',其中任何一種都適合這種類型的數據。你*不需要進行字符串搜索來存儲列表。 –

回答

0

使用NOT EXISTSARRAY子查詢使用standard SQL來表示這種邏輯比較容易。例如,

#standardSQL 
WITH Names AS (
    SELECT 'john' AS name, ['johnny', 'jonny'] AS nicknames UNION ALL 
    SELECT 'jon' AS name, ['jonny'] AS nicknames 
) 
SELECT 
    name 
FROM Names 
WHERE NOT EXISTS (
    SELECT 1 FROM UNNEST(nicknames) AS nickname 
    WHERE nickname LIKE '%johnny%' 
); 

再舉一個例子,你可能想僅包含暱稱不匹配的字符串:

#standardSQL 
WITH Names AS (
    SELECT 'john' AS name, ['johnny', 'jonny'] AS nicknames UNION ALL 
    SELECT 'jon' AS name, ['jonny'] AS nicknames 
) 
SELECT * 
FROM (
    SELECT 
    name, 
    ARRAY(SELECT nickname FROM UNNEST(nicknames) AS nickname 
      WHERE nickname NOT LIKE '%johnny%') AS nicknames 
    FROM Names 
) 
WHERE ARRAY_LENGTH(nicknames) > 0; 
0

在情況下,如果您仍結合至BigQuery傳統的SQL,下面是相應的解決方案

#legacySQL 
SELECT name FROM (
    SELECT 
    name, SUM(nicknames LIKE '%johnny%') WITHIN RECORD AS matches 
    FROM [mytable] 
) 
WHERE matches = 0 
+0

是的,我現在必須接受遺產。我也會試試這個。同時,我發現了一個類似的解決方案,使用group by和group_concat進行額外的選擇。 –

+0

@AlexandruRada - 如果使用額外的選擇與分組和group_concat - 它肯定不是類似的:o)同時,你有沒有嘗試以上的解決方案?它有幫助嗎? –