Проблема с оператором NOT. HELP!!!
От: loburets  
Дата: 24.09.02 08:08
Оценка:
Привет всем!

Помогите, пожалуйста, разобраться.
Есть у меня таблица с массой стринговых полей, для поиска в ней записей, включающих в себя сочетание "MILANO" я использую следующий код:

SELECT * FROM SYSDBA.X_OMAT1_VOL WHERE
(UPPER(XTIPO_DOC) LIKE '%MILANO%'
OR UPPER(XNUM_DOC) LIKE '%MILANO%'
OR UPPER(XEMES_RICE) LIKE '%MILANO%'
OR UPPER(XDEST_MITT) LIKE '%MILANO%'
OR UPPER(XINDIRIZZO) LIKE '%MILANO%'
OR UPPER(XLOCALITA) LIKE '%MILANO%'
OR UPPER(XCAP) LIKE '%MILANO%'
OR UPPER(XP_IVA) LIKE '%MILANO%'
OR UPPER(XCOD_CLI) LIKE '%MILANO%'
OR UPPER(XCOD_AGENT) LIKE '%MILANO%'
OR UPPER(XCOD_PAGAM) LIKE '%MILANO%'
OR UPPER(XNOTE1) LIKE '%MILANO%'
OR UPPER(XNOTE2) LIKE '%MILANO%'
OR UPPER(XSOURCE) LIKE '%MILANO%')

Это отрабатывает прекрасно и возвращается мне набор записей.

Но есть также необходимость найти все остальные записи, то есть те, которые не включают в себя данное сочетание.
Для этого я использую след. код:

SELECT * FROM SYSDBA.X_OMAT1_VOL WHERE ( NOT
(UPPER(XTIPO_DOC) LIKE '%MILANO%'
OR UPPER(XNUM_DOC) LIKE '%MILANO%'
OR UPPER(XEMES_RICE) LIKE '%MILANO%'
OR UPPER(XDEST_MITT) LIKE '%MILANO%'
OR UPPER(XINDIRIZZO) LIKE '%MILANO%'
OR UPPER(XLOCALITA) LIKE '%MILANO%'
OR UPPER(XCAP) LIKE '%MILANO%'
OR UPPER(XP_IVA) LIKE '%MILANO%'
OR UPPER(XCOD_CLI) LIKE '%MILANO%'
OR UPPER(XCOD_AGENT) LIKE '%MILANO%'
OR UPPER(XCOD_PAGAM) LIKE '%MILANO%'
OR UPPER(XNOTE1) LIKE '%MILANO%'
OR UPPER(XNOTE2) LIKE '%MILANO%'
OR UPPER(XSOURCE) LIKE '%MILANO%') )


Т.е. просто ставлю оператор NOT. Логически, должно бы срабатывать. Однако реально возвращает пустой рекордсет.
И никаких идей, почему же оператор NOT не отрабатывает. То ли я его использую не по назначению, то ли с таким запросом не справляется БД, я не знаю.
Использовать подзапросы, где нужно также указать имя таблицы, я не могу из-за архитектуры приложения, в котором пишется этот кусок, так как я формирую только выражение для WHERE и не знаю имени таблицы.

Пытался внести NOT за скобки и преобразовать все LIKE в NOT LIKE и заменить все OR на AND, но это срабатывает не всегда, в результате экспериментов с MSSQL2000 появилось предположение, что в этом случае суммарная длина всех полей не может превышать 200 символов.

З.Ы.: этот код должен работать (с небольшими отличиями в имени таблицы) на МССКЛ, оракле, интербейзе и фоксе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.