2016-05-16 115 views
2

当字符串'DebugData'包含数字时,我必须执行子选择。但在谷歌大查询中,我收到错误“Subselect不允许内部选择子句”。任何帮助,将不胜感激 !!在Google大查询中选择内部case语句

%%sql --module Test2 
DEFINE QUERY Test2 
SELECT 
HardwareId, DebugReason, DebugData, 
CASE 
    WHEN lower(DebugData) LIKE 'ver%' THEN 'Verizon' 
    WHEN lower(DebugData) LIKE 'ro%' THEN 'Rogers' 
    WHEN REGEXP_MATCH(DebugData,'\\d+') THEN c.Network 
    (SELECT Network from [red-road-574:RawDebug.CarrierDetails] Where Mcc = SUBSTR(DebugData,0,3) and Mnc = SUBSTR(DebugData,4,7)) 
    ELSE REGEXP_REPLACE(DebugData,'\\?',' ') 
END 
    as ActualDebugData 
    FROM (TABLE_DATE_RANGE([bigdata:RawDebug.T], TIMESTAMP ('2016-05-15'),TIMESTAMP('2016-05-15'))) 
    CROSS JOIN [bigdata:RawDebug.CarrierDetails] c 
    WHERE DebugReason = 50013 
    LIMIT 200 

我尝试这样做,但这不是工作:

SELECT 
    DebugData, 
    CASE 
    WHEN lower(DebugData) LIKE 'jas%' THEN 'Jasper' 
    WHEN REGEXP_MATCH(DebugData,'\\d+') THEN c.Network 
    ELSE REGEXP_REPLACE(DebugData,'\\?',' ') 
    END 
    as ActualDebugData 
    FROM (TABLE_DATE_RANGE([bigdata:RawDebug.T],TIMESTAMP ('2016-05-15'),TIMESTAMP('2016-05-15')) d) 
    CROSS JOIN [bigdata:RawDebug.CarrierDetails] c 
    WHERE d.DebugReason = 50013 and c.Mcc = SUBSTR(DebugData,0,3) 
LIMIT 200 

回答

1

使用LEFT JOIN代替。

SELECT 
    DebugData, 
    CASE 
    WHEN lower(DebugData) LIKE 'jas%' THEN 'Jasper' 
    WHEN REGEXP_MATCH(DebugData,'\\d+') THEN c.Network 
    ELSE REGEXP_REPLACE(DebugData,'\\?',' ') 
    END 
    as ActualDebugData 
    FROM (TABLE_DATE_RANGE([bigdata:RawDebug.T],TIMESTAMP ('2016-05-15'),TIMESTAMP('2016-05-15')) d) 
    LEFT JOIN [bigdata:RawDebug.CarrierDetails] c ON c.Mcc = SUBSTR(DebugData,0,3) 
    WHERE d.DebugReason = 50013 
LIMIT 200 

使用LEFT JOIN允许它从不符合加入条件的第一表返回行。

+0

我有两个where语句,一个用于主选择,另一个用于子选择。不知道如何使用两个选择的地方。 – user3447653

+0

使用一个'WHERE'语句并将它们与'AND'结合使用。 – Barmar

+0

我已经尝试了上面的代码(在我的主要部分添加了代码),但这不起作用。 – user3447653