Сравнение неравенства Oracle - неверный номер - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь создать предупреждение в моей системе с помощью приведенного ниже кода.Я попытался немного изменить его, но получаю ошибки или данные не возвращаются.

В своем утверждении select я вычислил разницу в днях с данными даты относительно sysdate.В моем предложении where я пытаюсь ограничить поступающие данные, используя оператор меньше или равный оператору.

SELECT A.COL_NAME AS "END OF SERVICE", B.DUSER AS "DATE",(TRUNC(B.DUSER) - TRUNC(SYSDATE))AS "DAYS LEFT"
FROM UD_COLS A LEFT OUTER JOIN UD_DATA B
ON A.ID = B.UD_COLS_ID
WHERE A.ID = 52 AND
('DAYS LEFT' <= 30)

Это приводит к ошибке: ORA-01722: недопустимый номер. Я попытался изменить выбранное, добавив TO_NUMBER (TRUNC (B.DUSER) - TRUNC (SYSDATE)) и по-прежнему получаю ту же ошибку.

Я также попытался перейти на ('DAYS LEFT' <= '30'), в котором я не получаю ошибок, но данные не возвращаются, как ожидалось.</p>

Без ('DAYS LEFT' <= 30) я вижу значение 1 в столбце "DAYS LEFT".Разве это не числовое значение?</p>

Если я использую оператор> =, данные заполняются независимо от значения.

Заранее спасибо.

1 Ответ

0 голосов
/ 13 февраля 2019

Уильям Робертсон объяснил в комментарии к вашему вопросу, что не так с вашим кодом (две вещи, одну, которую можно исправить - измените одинарные кавычки на двойные - и другую, которую нельзя исправить - вы не можете ссылаться вwhere (псевдоним, определенный в предложении select того же запроса).

Самое простое решение - изменить where на

where b.duser < trunc(sysdate) + 31

Это эквивалентноваше условие использует trunc(b.duser), но оно написано таким образом, что к b.duser не применяются никакие вызовы функций, что приводит к более быстрому выполнению и НАМНОГО более быстрому выполнению, если у вас есть индекс для этого столбца.

...