Привет всем!
Помогите, пожалуйста, разобраться.
Есть у меня таблица с массой стринговых полей, для поиска в ней записей, включающих в себя сочетание "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 символов.
З.Ы.: этот код должен работать (с небольшими отличиями в имени таблицы) на МССКЛ, оракле, интербейзе и фоксе.