Показать полную графическую версию : [решено] Запрос с множеством невходящих
blackeangel
07-01-2017, 09:58
Всем здрасьте.
Нужно как то написать запрос который будет выбирать все записи которые не содержат 45 перечисленных записей.
Where ([oboz] not like '%СБ') or ([oboz] not like '%ТУ') or ....И так 45 or'ов и так не работает.
Как правильно то?
blackeangel, я не знаком с диалектом SQL в варианте MySQL, но попробуйте посмотреть, нет ли у него конструкции наподобие NOT IN с подзапросом.
Навскидку, скажем:
MySQL :: MySQL 5.7 Reference Manual :: 14.2.10.3 Subqueries with ANY, IN, or SOME (http://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries.html)
MySQL :: MySQL 5.7 Reference Manual :: 14.2.10.6 Subqueries with EXISTS or NOT EXISTS (http://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html)
(сразу говорю, что даже не разбирался, то ли это).
blackeangel
07-01-2017, 14:15
blackeangel, я не знаком с диалектом SQL в варианте MySQL, но попробуйте посмотреть, нет ли у него конструкции наподобие NOT IN с подзапросом.
Навскидку, скажем:
MySQL :: MySQL 5.7 Reference Manual :: 14.2.10.3 Subqueries with ANY, IN, or SOME (http://dev.mysql.com/doc/refman/5.7/en/any-in-some-subqueries.html)
MySQL :: MySQL 5.7 Reference Manual :: 14.2.10.6 Subqueries with EXISTS or NOT EXISTS (http://dev.mysql.com/doc/refman/5.7/en/exists-and-not-exists-subqueries.html)
(сразу говорю, что даже не разбирался, то ли это).
А просто SQL?
Мне вообще это для бейсика надо...
Может, я и не в ту сторону копаю. В общем мне надо выполнить запрос в котором отсеятся все значения на конце которых содержатся перечисленные сочетания букв.
То есть они не должны попасть.
Что значит «просто SQL»? «Просто SQL» не бывает. Есть стандарт (точнее стандарты разных годов), есть производители ПО со своими продуктами, каждый из которых обладает своим диалектом SQL, каждый из которых поддерживает стандарт в той или иной степени.
Ваша ошибка в запросе вида:
Where ([oboz] not like '%СБ') or ([oboz] not like '%ТУ') or ....И так 45 or'ов и так не работает. »
в следующем (оно таки работает, работает правильно, и именно так, как заказывали): Вы получаете набор записей, который не содержит в конце поля oboz символов СБ (на рисунке — зелёный), затем получаете ещё один набор записей, который не содержит в конце поля oboz символов ТУ (на рисунке — синий), затем получаете ещё один набор записей, который не содержит в конце поля oboz символов … и так сорок пять раз. Затем наборы объединяются (OR). Таким образом, в результирующем наборе Вы получаете все записи таблицы (на рисунке — жёлтый):
http://i.imgur.com/Cn0bLbZ.png
Вам следует использовать либо такой синтаксис:
SELECT * FROM myschema.sometable Where oboz not like '%СБ' and oboz not like '%ТУ';
либо такой:
SELECT * FROM myschema.sometable Where not (oboz like '%СБ' or oboz like '%ТУ');
http://i.imgur.com/H6NB923.png
Но самым правильным будет использование оператора REGEXP:
SELECT * FROM myschema.sometable WHERE oboz NOT REGEXP '(СБ|ТУ)$';
blackeangel
08-01-2017, 19:02
Что значит «просто SQL»? «Просто SQL» не бывает. Есть стандарт (точнее стандарты разных годов), есть производители ПО со своими продуктами, каждый из которых обладает своим диалектом SQL, каждый из которых поддерживает стандарт в той или иной степени.
Ваша ошибка в запросе вида:
Where ([oboz] not like '%СБ') or ([oboz] not like '%ТУ') or ....И так 45 or'ов и так не работает. »
в следующем (оно таки работает, работает правильно, и именно так, как заказывали): Вы получаете набор записей, который не содержит в конце поля oboz символов СБ (на рисунке — зелёный), затем получаете ещё один набор записей, который не содержит в конце поля oboz символов ТУ (на рисунке — синий), затем получаете ещё один набор записей, который не содержит в конце поля oboz символов … и так сорок пять раз. Затем наборы объединяются (OR). Таким образом, в результирующем наборе Вы получаете все записи таблицы (на рисунке — жёлтый):
http://i.imgur.com/Cn0bLbZ.png
Вам следует использовать либо такой синтаксис:
SELECT * FROM myschema.sometable Where oboz not like '%СБ' and oboz not like '%ТУ';
либо такой:
SELECT * FROM myschema.sometable Where not (oboz like '%СБ' or oboz like '%ТУ');
http://i.imgur.com/H6NB923.png
Но самым правильным будет использование оператора REGEXP:
SELECT * FROM myschema.sometable WHERE oboz NOT REGEXP '(СБ|ТУ)$';
Спасибо, теперь понял свою ошибку
И что обозначает $ в конце?
Спасибо, теперь понял свою ошибку »
Хорошо. Только не надо цитировать всё сообщение целиком :).
И что обозначает $ в конце? »
Символ, обозначающий позицию регулярного выражения внутри текста/строки. В данном случае, «$» — в конце строки.
blackeangel
09-01-2017, 23:41
Iska, так будет правильно?
...NOT REGEXP '(СБ|ТУ|РР|ИМ|ДИ...)$'
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.