2016-12-05 2 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». Я выполняю всевозможные ошибки при выполнении этого запроса. Возможно ли это присвоить букву_source?

ответ

2

Это не задание - это сравнение. letter_source должен быть равен 'A' или 'B' в зависимости от условий.

Синтаксис IF неправильный. IF принимает 3 параметра: из hive documentation:

, если (булево testCondition, Т valueTrue, Т 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 
Смежные вопросы