Здравствуйте loburets, Вы писали:
L>Помогите, пожалуйста, разобраться. L>Есть у меня таблица с массой стринговых полей, для поиска в ней записей, включающих в себя сочетание "MILANO" я использую следующий код:
[skip]
L>Т.е. просто ставлю оператор NOT. Логически, должно бы срабатывать. Однако реально возвращает пустой рекордсет. L>И никаких идей, почему же оператор NOT не отрабатывает. То ли я его использую не по назначению, то ли с таким запросом не справляется БД, я не знаю.
Что-то ответил побырому, а потом сам засомневался... Но проверять сейчас лень.
Попробуй сформировать условие так:
... OR (<field> like '%%' AND NOT <field> IS NULL)....
Просто очень часто попадается ошибка когда подзапрос возвращает NULL и в этом случае условие NOT IN(), понятное дело, работает не корректно, но это немного не твой случай...
Помогите, пожалуйста, разобраться.
Есть у меня таблица с массой стринговых полей, для поиска в ней записей, включающих в себя сочетание "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 символов.
З.Ы.: этот код должен работать (с небольшими отличиями в имени таблицы) на МССКЛ, оракле, интербейзе и фоксе.
Здравствуйте 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
Здравствуйте 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 — смотрел на нем. а вообще еще и оракл и интербейз
Здравствуйте 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 операндов, в зависимости от комбинаций полей.
Хочу сказать БОЛЬШОЕ СПАСИБО всем, кто откликнулся на мой крик о помощи.
Особую благодарность выражаю Merle и Andrey_N за их верный совет. Все заработало, результаты подтвердили, что возвращались только те записи, в которых нет пустых полей среди искомых. И лишь остается хлопнуть себя по лбу, что раньше до этого недопер и не заметил
Теперь можно считать еще один пункт с багами закрытым.