2013-03-31 2 views
1

У меня есть SQL заявление:Informix SQL Help: Результат логического выражения не логического типа

UPDATE informix.dv_billing dv 
    SET dv.fee = CASE WHEN ((SELECT dc.mm_discount 
           FROM dv_mm_disc dc 
          WHERE dc.year = YEAR(dv.tdate) 
           AND dc.quarter = quarter(dv.tdate) 
           AND dc.bid=dv.bid 
           AND dc.mm_code=dv.pcode 
           AND dc.ins=dv.ins) = 0) 
        THEN dv.fee ELSE 0 
       END 
WHERE MDY(MONTH('2012-04-05'), 1, YEAR('2012-04-05')) - 2 UNITS MONTH 
    AND last_day(DATE('2012-04-05')) 
; 

SQL, возвращает ошибку:

Result of a boolean expression is not of boolean type. 

Что может быть не так?

ответ

0

Я думаю, что у вас проблемы с внешним (основным) предложением WHERE.

У вас есть условие, которое номинально:

WHERE expr1 AND expr2 

, который требует как выражение1 и expr2, чтобы быть логических выражений, но фактические выражения не булевы - следовательно, сообщение немного странно сформулированной ошибки.

Выражение:

MDY(MONTH('2012-04-05'), 1, YEAR('2012-04-05')) - 2 UNITS MONTH 

дает DATE (или, возможно, DATETIME YEAR TO DAY) результат. Разумно предположить, что функция last_day() возвращает дату последнего дня месяца, содержащего заданную дату.

Возможно, что последний И должен быть =?

WHERE MDY(MONTH('2012-04-05'), 1, YEAR('2012-04-05')) - 2 UNITS MONTH = last_day(DATE('2012-04-05')) 

Это может быть сокращено до:

WHERE MDY(4, 1, 2012) - 2 UNITS MONTH = last_day(DATE('2012-04-05')) 

Я не уверен, когда это условие будет когда-либо карту, чтобы верно ... но это отдельный разговор. Я действительно признаю, что «2012-04-05», скорее всего, является параметром запроса, упрощенным с целью задать вопрос, поэтому аббревиатура не является общей в действительной, но мне кажется маловероятным, что первый день месяца будет когда-либо последний день любого месяца (но много зависит от того, что находится в этой функции last_day()).

+0

Вы правы. Я забыл поставить компаратор для выражения. Запроса стали: ОБНОВЛЕНИЕ informix.dv_billing DV SET dv.fee = случай, когда ((SELECT dc.mm_discount ОТ dv_mm_disc DC ГДЕ dc.year = ГОД (dv.tradedate) И dc.quarter = четверть (dv.tradedate) И dc.boardid = dv.boardid И dc.mm_code = dv.participantcode И dc.instrument = dv.instrid) = 0) THEN dv.fee ELSE 0 END WHERE dv.tradedate МЕЖДУ МЕДИ (МЕСЯЦ ('2012-04 -05 '), 1, YEAR (' 2012-04-05 ')) - 2 ЕДИНИЦА МЕСЯЦА И last_day (DATE (' 2012-04-05 ')) GO –

+0

МЕЖДУ И условие имеет намного больше смысла! –

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