2013-09-06 4 views
0

У меня есть две таблицы, одна таблица содержит циклы оплаты, а другой содержит вещи, которые должны быть оплачены в зависимости ежегодно, ежемесячно и т.д.Дело MySQL только оценивает первое условие.

Я запросов к базе данных таким образом:

SELECT 
    L.UserID, 
    U.Username, 
    L.CostPerCycle, 
    CT.CycleType, 
    CASE L.CycleTypeID 
     WHEN L.CycleTypeID = 1 THEN L.CostPerCycle * 12 
     WHEN L.CycleTypeID = 2 THEN L.CostPerCycle * 3 
     WHEN L.CycleTypeID = 3 THEN L.CostPerCycle * 2 
     WHEN L.CycleTypeID = 4 THEN L.CostPerCycle 
     WHEN L.CycleTypeID = 5 THEN L.CostPerCycle 
    END AS AnnualCost 
FROM 
    Links L 
    LEFT JOIN Users U ON L.UserID = U.UserID 
    LEFT JOIN CycleTypes CT ON L.CycleTypeID = CT.CycleTypeID 
WHERE 
    L.CycleTypeID <> 6; 

Проблема в том, что MySQL возвращает значения NULL вместо результата умножения, и я не совсем уверен, почему.

Я заметил, что оценивается только первое условие, но я не уверен, что происходит с остальными.

Другими словами:

Если есть запись с CycleTypeID = 1 затем MySQL умножает CostPerCycle раз 12. Однако если CycleTypeID отличается от первого условия, то MySQL делает что-то, и я не уверен, что он делает что в основном «игнорирует» остальные мои условия.

Надеюсь, что информации достаточно, чтобы указать мне в правильном направлении!

Спасибо!

ответ

3

Это case заявление вы хотите:

CASE 
    WHEN L.CycleTypeID = 1 THEN L.CostPerCycle * 12 
    WHEN L.CycleTypeID = 2 THEN L.CostPerCycle * 3 
    WHEN L.CycleTypeID = 3 THEN L.CostPerCycle * 2 
    WHEN L.CycleTypeID = 4 THEN L.CostPerCycle 
    WHEN L.CycleTypeID = 5 THEN L.CostPerCycle 
END AS AnnualCost; 

Вы путаете две разные формы заявления. Вы могли бы также фраза это как:

CASE L.CycleTypeID 
    WHEN 1 THEN L.CostPerCycle * 12 
    WHEN 2 THEN L.CostPerCycle * 3 
    WHEN 3 THEN L.CostPerCycle * 2 
    WHEN 4 THEN L.CostPerCycle 
    WHEN 5 THEN L.CostPerCycle 
END AS AnnualCost; 

Причина ваша версия возвращает NULL значения, потому что это является сравнение L.CycleTypeId к значению выражения L.CycleTypeId = x. Это последнее выражение равно либо 0, либо 1. Единственными возможными совпадениями являются идентификаторы 0 и 1. Все остальное провалится. Без предложения else они получают значения NULL.

+0

Также нет ELSE, поэтому любое значение> 5 также приведет к значениям NULL. –

+0

Спасибо, что голова раздувается, и для ответа Гордон. Я посмотрел на документацию MySQL, и я не понимал, что смешиваю две формы одного и того же оператора. Интересно, почему MySQL имеет два способа написать один и тот же оператор. – ILikeTacos

+0

@AlanChavez. , , Это не MySQL, это стандарт ANSI, который имеет два. –

Смежные вопросы