2015-02-26 2 views
0

Вот скрипка; http://sqlfiddle.com/#!2/af8015/9SQL-запрос для установки значения, если существуют данные

Я некоторые данные, и я хочу, чтобы установить

  • если пользователь и параметр г в таблице с именем п, в результате столбец должен быть 1;
  • если параметр user и g указан в таблице с именем im, но не в cl, результат столбец должен быть -1;
  • еще, результат должен быть столбец 0

Я использую следующий запрос;

select *, 
    case cl.user_id 
     when null then -1 
     when im.user_id then 1 
    end as result 
from im 
left join cl  on cl.user_id = im.user_id 
       and cl.id_g = im.id_g 
left join user on user.user_id = im.user_id 
left join g  on g.id_g = im.id_g 

Но, он возвращает значение null для -1, и я не мог установить 0 для последнего случая.

Ожидаемая таблица результатов;

user id - g id - result 
    1   1  1 
    1   2  1 
    1   3  0 
    1   4  1 
    2   1  1 
    2   2  1 
    2   3 -1 
    2   4  0 
... 
+1

Почему ваша последовательность 'JOIN' начинается с таблицы' im'? Одно из ваших требований, по-видимому, связано с тем, что из этой таблицы будет отсутствовать строка. –

ответ

1

я не могу видеть способ генерации 0 результата от данных образцов.

Я считаю, что ваш result параметр должен быть рассчитан следующим образом:

IF (cl.user_id IS NOT NULL and cl.id_g IS NOT NULL, 1, 
    IF(im.user_id IS NOT NULL and im.id_g IS NOT NULL, -1,0) 
    ) result 

И, я думаю, ваша серия операций JOIN должна проходить следующим образом.

FROM user 
LEFT JOIN im ON user.user_id = im.user_id 
LEFT JOIN cl ON user.user_id = cl.user_id AND im.id_g = cl.id_g 
LEFT JOIN g ON im.id_g = g.id_g 

То есть, вы должны вести с user столом. Вот пример: http://sqlfiddle.com/#!2/a5c6ef/1/0

Ваш параметр result вычисляется следующим образом:

case cl.user_id 
    when null then -1 
    when im.user_id then 1 
end as result 

null значения работают странно. Значение null никогда не сравнится ни с чем, даже с другим значением null, поэтому when null then -1 никогда не будет стрелять. Это выражение, с другой стороны, должно работать.

case when cl.user_id IS NULL then -1 
     when im.user_id IS NULL then 1 
     else 0 end as result 
Смежные вопросы