2016-12-05 278 views
0

分配值我碰到下面的查詢在一個封閉的倉庫傳來:嵌套的IF語句,以

SELECT * FROM tab1 join tab2 on tab1.event1=tab2.event2 
WHERE 
tab1.is_valid_num IS NULL OR 
IF(tab1.is_valid_num AND tab1.is_valid_name, 'A', 
tab1.is_valid_address AND tab1.is_valid_phone, 'B', 
tab1.is_valid_num OR tab1.is_valid_name, 'A', 'B')=letter_source 

is_valid_ *是布爾類型。 Letter_source應該是'A'或'B'。 運行此查詢時遇到各種錯誤。 這種方式是否可以分配letter_source?

回答

2

這不是一個任務 - 這是一個比較。根據條件, letter_source應該等於'A''B'

IF語法錯誤。 IF需要3個參數: 從hive documentation

如果(布爾testCondition,T valueTrue,T valueFalseOrNull)

返回valueTrue當testCondition爲真,則返回valueFalseOrNull否則。

所以您的查詢或許應該是這樣的:

SELECT * FROM tab1 join tab2 on tab1.event1=tab2.event2 
WHERE 
tab1.is_valid_num IS NULL OR 
IF(tab1.is_valid_num AND tab1.is_valid_name, 'A', 
    IF(tab1.is_valid_address AND tab1.is_valid_phone, 'B', 
     IF(tab1.is_valid_num OR tab1.is_valid_name, 'A', 'B')))=letter_source 

而且,在這些情況下,CASE是比較合適的,可讀性:

SELECT * FROM tab1 join tab2 on tab1.event1=tab2.event2 
WHERE 
tab1.is_valid_num IS NULL OR 
CASE WHEN tab1.is_valid_num AND tab1.is_valid_name THEN 'A' 
    WHEN tab1.is_valid_address AND tab1.is_valid_phone THEN 'B' 
    WHEN tab1.is_valid_num OR tab1.is_valid_name THEN 'A' 
    ELSE 'B' END = letter_source