Проблема с оператором 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 символов.

З.Ы.: этот код должен работать (с небольшими отличиями в имени таблицы) на МССКЛ, оракле, интербейзе и фоксе.
Re: Проблема с оператором NOT. HELP!!!
От: Zar Россия  
Дата: 24.09.02 08:11
Оценка:
Здравствуйте loburets, Вы писали:

Может

L>SELECT * FROM SYSDBA.X_OMAT1_VOL WHERE ( NOT

L>(UPPER(XTIPO_DOC) LIKE '%MILANO%'

Заменить на

SELECT * FROM SYSDBA.X_OMAT1_VOL WHERE (
(UPPER(XTIPO_DOC) NOT LIKE '%MILANO%'

и т.д. ?

Уточнил бы, что у тебя за SQL-сервер...
[ Zarathustra ]
Re: Проблема с оператором NOT. HELP!!!
От: alexzapl  
Дата: 24.09.02 08:32
Оценка:
Здравствуйте loburets, Вы писали:

L>Привет всем!


L>Помогите, пожалуйста, разобраться.

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

L>SELECT * FROM SYSDBA.X_OMAT1_VOL WHERE

L>(UPPER(XTIPO_DOC) LIKE '%MILANO%'
L>OR UPPER(XNUM_DOC) LIKE '%MILANO%'
L>OR UPPER(XEMES_RICE) LIKE '%MILANO%'
L>OR UPPER(XDEST_MITT) LIKE '%MILANO%'
L>OR UPPER(XINDIRIZZO) LIKE '%MILANO%'
L>OR UPPER(XLOCALITA) LIKE '%MILANO%'
L>OR UPPER(XCAP) LIKE '%MILANO%'
L>OR UPPER(XP_IVA) LIKE '%MILANO%'
L>OR UPPER(XCOD_CLI) LIKE '%MILANO%'
L>OR UPPER(XCOD_AGENT) LIKE '%MILANO%'
L>OR UPPER(XCOD_PAGAM) LIKE '%MILANO%'
L>OR UPPER(XNOTE1) LIKE '%MILANO%'
L>OR UPPER(XNOTE2) LIKE '%MILANO%'
L>OR UPPER(XSOURCE) LIKE '%MILANO%')

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

L>Но есть также необходимость найти все остальные записи, то есть те, которые не включают в себя данное сочетание.

L>Для этого я использую след. код:

L>SELECT * FROM SYSDBA.X_OMAT1_VOL WHERE ( NOT

L>(UPPER(XTIPO_DOC) LIKE '%MILANO%'
L>OR UPPER(XNUM_DOC) LIKE '%MILANO%'
L>OR UPPER(XEMES_RICE) LIKE '%MILANO%'
L>OR UPPER(XDEST_MITT) LIKE '%MILANO%'
L>OR UPPER(XINDIRIZZO) LIKE '%MILANO%'
L>OR UPPER(XLOCALITA) LIKE '%MILANO%'
L>OR UPPER(XCAP) LIKE '%MILANO%'
L>OR UPPER(XP_IVA) LIKE '%MILANO%'
L>OR UPPER(XCOD_CLI) LIKE '%MILANO%'
L>OR UPPER(XCOD_AGENT) LIKE '%MILANO%'
L>OR UPPER(XCOD_PAGAM) LIKE '%MILANO%'
L>OR UPPER(XNOTE1) LIKE '%MILANO%'
L>OR UPPER(XNOTE2) LIKE '%MILANO%'
L>OR UPPER(XSOURCE) LIKE '%MILANO%') )


L>Т.е. просто ставлю оператор NOT. Логически, должно бы срабатывать. Однако реально возвращает пустой рекордсет.

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

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


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



попробуй вов тором запросе OR заменить на AND

выражению A or B противоположное будет not A and not B

Re[2]: Проблема с оператором NOT. HELP!!!
От: loburets  
Дата: 24.09.02 08:41
Оценка:
Здравствуйте Zar, Вы писали:

Zar>Здравствуйте loburets, Вы писали:


Zar>Может


L>>SELECT * FROM SYSDBA.X_OMAT1_VOL WHERE ( NOT

L>>(UPPER(XTIPO_DOC) LIKE '%MILANO%'

Zar>Заменить на


Zar>SELECT * FROM SYSDBA.X_OMAT1_VOL WHERE (

Zar>(UPPER(XTIPO_DOC) NOT LIKE '%MILANO%'

Zar>и т.д. ?

Как я писал уже в первом сообщении (см. ниже в нем), я так уже пытался сделать, однако проблема в том, что таких вот NOT LIKE столько, сколько полей в таблице, а реально работает запрос с 4-8 полями только ((

Zar>Уточнил бы, что у тебя за SQL-сервер...

MS SQL 2000 — смотрел на нем. а вообще еще и оракл и интербейз
Re[2]: Проблема с оператором NOT. HELP!!!
От: loburets  
Дата: 24.09.02 08:48
Оценка:
Здравствуйте alexzapl, Вы писали:

A>

A>попробуй вов тором запросе OR заменить на AND

A>выражению A or B противоположное будет not A and not B


A>


проблема не в OR. Проблема в NOT (выражение).
к тому же я уже пытался исправить выражение NOT ( LIKE OR LIKE ) на выражение NOT LIKE AND NOT LIKE.

Тут я наткнулся на такую вещь в МССКЛ2000, что при превышении некоторых неизвестных причин (как например подуманной мной ограничение в 200 символов суммарной длины полей) количества NOT LIKE через AND запрос перестает работать. у меня это от 4 до 8 операндов, в зависимости от комбинаций полей.
Re: Проблема с оператором NOT. HELP!!!
От: Merle Австрия http://rsdn.ru
Дата: 24.09.02 08:56
Оценка: 9 (2)
Здравствуйте loburets, Вы писали:

L>Помогите, пожалуйста, разобраться.

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

L>Т.е. просто ставлю оператор NOT. Логически, должно бы срабатывать. Однако реально возвращает пустой рекордсет.

L>И никаких идей, почему же оператор NOT не отрабатывает. То ли я его использую не по назначению, то ли с таким запросом не справляется БД, я не знаю.
Что-то ответил побырому, а потом сам засомневался... Но проверять сейчас лень.
Попробуй сформировать условие так:
... OR (<field> like '%%' AND NOT <field> IS NULL)....


Просто очень часто попадается ошибка когда подзапрос возвращает NULL и в этом случае условие NOT IN(), понятное дело, работает не корректно, но это немного не твой случай...
Мы уже победили, просто это еще не так заметно...
Re[2]: Проблема с оператором NOT. HELP!!!
От: Andrey_N  
Дата: 24.09.02 16:30
Оценка: 3 (1)
Здравствуйте Merle, Вы писали:

M>Здравствуйте loburets, Вы писали:


[skip]

M>
... OR (<field> like '%%' AND NOT <field> IS NULL)....


[skip]


Как уже правильно подметили проблема с NULL.

второй запрос (для случая без MILANO):
WHERE 
(f1 not like '%mmm%' or f1 is null) and
(f2 not like '%mmm%' or f2 is null) ...


или как предложил loburets:
WHERE NOT (
(f1 LIKE '%mmm%' AND f1 IS NOT NULL) OR
(f2 LIKE '%mmm%' AND f2 IS NOT NULL) ... )


Удачи
Андрей
Re[3]: Проблема с оператором NOT. HELP!!!
От: Andrey_N  
Дата: 24.09.02 16:34
Оценка:
AN>или как предложил loburets:

Упс, ошибся. Должна была быть ссылка на авторство Merle
Прошу прощения.

Андрей
Re: Проблема с оператором NOT. HELP!!!
От: Dushkinson  
Дата: 25.09.02 03:24
Оценка:
Хочу сказать БОЛЬШОЕ СПАСИБО всем, кто откликнулся на мой крик о помощи.
Особую благодарность выражаю Merle и Andrey_N за их верный совет. Все заработало, результаты подтвердили, что возвращались только те записи, в которых нет пустых полей среди искомых. И лишь остается хлопнуть себя по лбу, что раньше до этого недопер и не заметил

Теперь можно считать еще один пункт с багами закрытым.

Сенкс еще раз,

Андрей.
Re[2]: Проблема с оператором NOT. HELP!!!
От: Dushkinson  
Дата: 25.09.02 03:27
Оценка:
Здравствуйте Dushkinson, Вы писали:

Сам посмотрел на свою мессагу и прикололся. Поясняю. Это я (loburets) заполнил вчера свой профайл и теперь Dushkinson
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.