Interbase: ошибка преобразования из строки

Я запускаю IB2009 и пытаюсь подсчитать количество записей, в которых конкретное поле не является ни NULL, ни пустым:

SELECT COUNT(A.ID) FROM MYVIEW A
WHERE ((A.VARCHARFIELD1 IS NOT NULL) OR (A.VARCHARFIELD1 <> ''))

где MYVIEW - это ВИД, а MYVIEW.ID - это INTEGER, а MYVIEW.VARCHARFIELD1 - это VARCHAR (18).

Я получаю сообщение об ошибке

Ошибка в строке 1, ошибка преобразования из строки ""

чего я действительно не понимаю, поскольку, когда я отбрасываю функцию COUNT (), запрос выполняется нормально. Кто-нибудь знает, что я делаю не так? Спасибо!


person conciliator    schedule 15.01.2010    source источник


Ответы (1)


Я не вижу ничего плохого в использовании COUNT () в этом случае. Хотя это не имеет значения, вы можете попробовать удалить все круглые скобки в предложении WHERE. Вы также можете попробовать использовать COUNT (*) вместо COUNT (A.ID), чтобы посмотреть, дает ли это вам другие результаты.

В любом случае, исходя из вашего описания цели запроса, я не думаю, что запрос будет делать то, что вы планировали. Если запрос должен возвращать строки, в которых поле не является ни NULL, ни пустым, я считаю, что ваше предложение WHERE должно быть

WHERE A.VARCHARFIELD1 IS NOT NULL AND
      A.VARCHARFIELD1 <> ''

С «ИЛИ» там, как было написано изначально, я думаю, вы вернетесь к каждой строке в таблице, где A.VARCHARFIELD1 НЕ НУЛЕВО, поскольку предикат «field NOT NULL» допускает все значения, отличные от NULL, и поскольку два предиката соединяются оператором ИЛИ, второй предикат не имеет значения.

Надеюсь, это поможет.

person Bob Jarvis - Reinstate Monica    schedule 15.01.2010
comment
Боб: ну, я на самом деле пробовал COUNT (*), но безуспешно. Вы совершенно правы относительно «И» / «ИЛИ» - вместо них определенно должно быть «И». Спасибо! (+1) Я считаю, что это ошибка в том, как IB обрабатывает ВИДЫ ... Это работает как чудо, когда выполняется для таблицы с идентичными полями. - person conciliator; 15.01.2010