Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Запрос с множеством невходящих (http://forum.oszone.net/showthread.php?t=322402)

blackeangel 07-01-2017 09:58 2701434

Запрос с множеством невходящих
 
Всем здрасьте.
Нужно как то написать запрос который будет выбирать все записи которые не содержат 45 перечисленных записей.
Where ([oboz] not like '%СБ') or ([oboz] not like '%ТУ') or ....И так 45 or'ов и так не работает.
Как правильно то?

Iska 07-01-2017 11:32 2701450

blackeangel, я не знаком с диалектом SQL в варианте MySQL, но попробуйте посмотреть, нет ли у него конструкции наподобие NOT IN с подзапросом.

Навскидку, скажем:
MySQL :: MySQL 5.7 Reference Manual :: 14.2.10.3 Subqueries with ANY, IN, or SOME
MySQL :: MySQL 5.7 Reference Manual :: 14.2.10.6 Subqueries with EXISTS or NOT EXISTS
(сразу говорю, что даже не разбирался, то ли это).

blackeangel 07-01-2017 14:15 2701489

Цитата:

Цитата Iska (Сообщение 2701450)
blackeangel, я не знаком с диалектом SQL в варианте MySQL, но попробуйте посмотреть, нет ли у него конструкции наподобие NOT IN с подзапросом.

Навскидку, скажем:
MySQL :: MySQL 5.7 Reference Manual :: 14.2.10.3 Subqueries with ANY, IN, or SOME
MySQL :: MySQL 5.7 Reference Manual :: 14.2.10.6 Subqueries with EXISTS or NOT EXISTS
(сразу говорю, что даже не разбирался, то ли это).

А просто SQL?
Мне вообще это для бейсика надо...

Может, я и не в ту сторону копаю. В общем мне надо выполнить запрос в котором отсеятся все значения на конце которых содержатся перечисленные сочетания букв.
То есть они не должны попасть.

Iska 07-01-2017 19:20 2701609

Что значит «просто SQL»? «Просто SQL» не бывает. Есть стандарт (точнее стандарты разных годов), есть производители ПО со своими продуктами, каждый из которых обладает своим диалектом SQL, каждый из которых поддерживает стандарт в той или иной степени.

Ваша ошибка в запросе вида:
Цитата:

Цитата blackeangel
Where ([oboz] not like '%СБ') or ([oboz] not like '%ТУ') or ....И так 45 or'ов и так не работает. »

в следующем (оно таки работает, работает правильно, и именно так, как заказывали): Вы получаете набор записей, который не содержит в конце поля oboz символов СБ (на рисунке — зелёный), затем получаете ещё один набор записей, который не содержит в конце поля oboz символов ТУ (на рисунке — синий), затем получаете ещё один набор записей, который не содержит в конце поля oboz символов … и так сорок пять раз. Затем наборы объединяются (OR). Таким образом, в результирующем наборе Вы получаете все записи таблицы (на рисунке — жёлтый):
Скрытый текст

Вам следует использовать либо такой синтаксис:
Код:

SELECT * FROM myschema.sometable Where oboz not like '%СБ' and oboz not like '%ТУ';
либо такой:
Код:

SELECT * FROM myschema.sometable Where not (oboz like '%СБ' or oboz like '%ТУ');
Скрытый текст


Но самым правильным будет использование оператора REGEXP:
Код:

SELECT * FROM myschema.sometable WHERE oboz NOT REGEXP '(СБ|ТУ)$';

blackeangel 08-01-2017 19:02 2701848

Цитата:

Цитата Iska (Сообщение 2701609)
Что значит «просто SQL»? «Просто SQL» не бывает. Есть стандарт (точнее стандарты разных годов), есть производители ПО со своими продуктами, каждый из которых обладает своим диалектом SQL, каждый из которых поддерживает стандарт в той или иной степени.

Ваша ошибка в запросе вида:
Цитата:

Цитата blackeangel
Where ([oboz] not like '%СБ') or ([oboz] not like '%ТУ') or ....И так 45 or'ов и так не работает. »

в следующем (оно таки работает, работает правильно, и именно так, как заказывали): Вы получаете набор записей, который не содержит в конце поля oboz символов СБ (на рисунке — зелёный), затем получаете ещё один набор записей, который не содержит в конце поля oboz символов ТУ (на рисунке — синий), затем получаете ещё один набор записей, который не содержит в конце поля oboz символов … и так сорок пять раз. Затем наборы объединяются (OR). Таким образом, в результирующем наборе Вы получаете все записи таблицы (на рисунке — жёлтый):
Скрытый текст

Вам следует использовать либо такой синтаксис:
Код:

SELECT * FROM myschema.sometable Where oboz not like '%СБ' and oboz not like '%ТУ';
либо такой:
Код:

SELECT * FROM myschema.sometable Where not (oboz like '%СБ' or oboz like '%ТУ');
Скрытый текст


Но самым правильным будет использование оператора REGEXP:
Код:

SELECT * FROM myschema.sometable WHERE oboz NOT REGEXP '(СБ|ТУ)$';

Спасибо, теперь понял свою ошибку
И что обозначает $ в конце?

Iska 09-01-2017 02:27 2701948

Цитата:

Цитата blackeangel
Спасибо, теперь понял свою ошибку »

Хорошо. Только не надо цитировать всё сообщение целиком :).

Цитата:

Цитата blackeangel
И что обозначает $ в конце? »

Символ, обозначающий позицию регулярного выражения внутри текста/строки. В данном случае, «$» — в конце строки.

blackeangel 09-01-2017 23:41 2702232

Iska, так будет правильно?
Код:

...NOT REGEXP '(СБ|ТУ|РР|ИМ|ДИ...)$'

Iska 10-01-2017 00:04 2702238

blackeangel, да.


Время: 01:27.

Время: 01:27.
© OSzone.net 2001-