|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Из базы данных в формате gdb хочу сделать выборку клиентов у которых заполнены поля дня рождения и телефон. Работаю на Ubuntu 16.04 64-bit использую flamerobin. Делаю запрос на выборку всех данных: SELECT r.ID, r.FAM, r.IME, r.OTCH, r.ADRESS, r.DATE_BORN, r.TEL_MOB, r.GOROD, r.STREET, r.DOM, r.KORP, r.FLAT FROM PACIENT r Получается 10605 записей Делаю запрос с исключением пустых полей SELECT r.ID, r.FAM, r.IME, r.OTCH, r.ADRESS, r.DATE_BORN, r.TEL_MOB, r.GOROD, r.STREET, r.DOM, r.KORP, r.FLAT FROM PACIENT r where r.DATE_BORN is not null or r.TEL_MOB is not null Получается 9856 записей. Но сразу бросилось в глаза что это не так. Проверяю по отдельности запросами вида SELECT r.ID, r.FAM, r.IME, r.OTCH, r.ADRESS, r.DATE_BORN, r.TEL_MOB, r.GOROD, r.STREET, r.DOM, r.KORP, r.FLAT FROM PACIENT r where r.DATE_BORN is null и вижу, что по отдельности выбирает 3036 и 1573 записи. Ясно, что суммы не сходятся. А в чем тут подвох? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:14 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Hello, Sergey113! You wrote on 20 июня 2016 г. 15:18:55: Sergey113> Получается 9856 записей. для подсчёта количества записей удовлетворяющих критериям используют SELECT COUNT(*) FROM ... WHERE ... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:20 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
sergey113, в этом Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:20 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Мимопроходящий, Большое спасибо. Не знал. Выполнил с Вашим кодом и получил те же самые цифры. Явно не сходятся результаты Общее число записей = 10605 После фильтрации нулевых полей с оператором OR получается 9856. Разница 749 записей. Должен исключить как минимум 3036+1573=4609 записей ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:27 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Симонов Денис, Разве такая запись некорректна? Ее мне подсказывает сам построитель запроса в flamerobin. Что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:29 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
sergey113, 1. подозрительно что вы вообще хотели это проверить 2. ну я как-то расcчитывал что вы not null хотите проверить, а не на оборот null :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:41 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Подвох в том, что эти множества - r.DATE_BORN is null и r.TEL_MOB is null могут пересекаться причем вы сами их пересекаете. объединяя их по "ИЛИ" (OR) сравните "Выбрать всех пациентов "не мужчин" или "не старых" естественно, что туда могут попасть нестарые мужчины, или старые "не мужчины". чтобы выбрать все записи без пустых полей, вам надо объединять эти множества по "И" - тогда вы получите записи, у которых И одно поле заполнено, и второе. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:49 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Симонов Денис, Я Вас не понял. Сначала я выбираю то что хочу получить. Ну а потом для проверки инвертирую оператор чтобы посмотреть на самом ли деле выбрано правильно. А ответ на мой ыопрос видимо в подобной ситуации как описано тут https://habrahabr.ru/post/127327/ fireberd видимо страдает тем же гемороем. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:50 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Hello, Sergey113! You wrote on 20 июня 2016 г. 15:52:53: Sergey113> А ответ на мой ыопрос видимо в подобной ситуации как описано тут > https://habrahabr.ru/post/127327/ КГ/АМ зы: взрослые люди по хабрам не шастают! Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:56 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 15:58 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
sergey113, нет геморрой проявляется только у того кто не понимает что такое NULL. А в Оракл геморрой проявляется с утроенной силой при попытке разработки приложения работающего более чем с одной СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:00 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Hello, Sergey113! You wrote on 20 июня 2016 г. 16:01:35: Sergey113> http://firebirdsql.org/manual/ru/nullguide-null-in-exps-ru.html это ты кому сейчас тынцнул? все здесь присутствующие таки давно прошли КМБ. видимо, кроме тебя. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:03 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Я не любитель намеков и многозначительных фраз. Поэтому указал ссылку, чтобы другой человек, который столкнется с таким вопросом смог более оперативно получить подсказку. Ответ на мой вопрос в том, что firebird обрабатывает null согласно этой таблице истинности. авторNULL в логических выражениях Мы уже рассмотрели, что not(NULL) дает в результате NULL. Для операторов and (логическое И) и or (логическое ИЛИ) взаимодействие несколько сложнее: NULL or false = NULL NULL or true = true NULL or NULL = NULL NULL and false = false NULL and true = NULL NULL and NULL = NULL таким образом строка к которой поле дата рождения оказывалась NULL (дата рождения отсутствует), а номер телефона TRUE (т.е. not null - телефон есть) оказывалась TRUE. А я ожидал в этом случае FALSE. Ну и я не согласен с логикой firebird NULL or true = true - это не правильно. И как теперь пользоваться по нормальному оператором OR или AND ? Разбивать на шаги, но это удар по автоматизации. Postgres тоже таким страдает? Какая база данных работает с NULL как в булевой математике? Или нет таких? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:16 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
sergey113, хватит писать бред. Предикаты IS NULL и IS NOT NULL всегда однозначны и могут вернуть только TRUE и FALSE. И насколько мне известно Postgres работает с NULL согласно стандарту, т.е. точно так же как Firebird. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:20 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Hello, Sergey113! You wrote on 20 июня 2016 г. 16:19:33: Sergey113> Ну и я не согласен с логикой firebird > NULL or true = true > это не правильно. читай ещё раз статью, тынц на которую ты привёл. NULL or true = NULL Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:21 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Hello, Симонов Денис! You wrote on 20 июня 2016 г. 16:22:13: Симонов Денис> И насколько мне известно Postgres работает с NULL согласно стандарту, т.е. точно так же как Firebird. все RDBMS работают с NULL согласно стандарту. отдельные "прыжки в сторону" есть у MSSQL и Oracle, но не в данном случае. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:23 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
МимопроходящийSergey113> Ну и я не согласен с логикой firebird > NULL or true = true > это не правильно. читай ещё раз статью, тынц на которую ты привёл. NULL or true = NULL Да нет, тут как раз всё правильно TRUE or NULL = TRUE это легко выводится так TRUE or (ХЗ, т.е. любое логическое значение) = TRUE ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:30 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Hello, Симонов Денис! You wrote on 20 июня 2016 г. 16:31:13: Симонов Денис> Да нет, тут как раз всё правильно > TRUE or NULL = TRUEа, тьфу, блин. точно. чё-то меня торкнуло. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:32 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
МимопроходящийNULL or true = NULL Чо? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:33 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Мимопроходящий, читай сам ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:34 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Hello, Sergey113! You wrote on 20 июня 2016 г. 16:43:42: Sergey113> читай сами на старуху бывает проруха. слушай что Денис говорит. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:45 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Cobalt747, Пропустил Ваш пост. Одновременно писал свой. Спасибо за совет. Я так делать не буду. Лучше разобью на 2 шага и буду использовать конструкции максимально простые. Так будет меньше вероятность ошибки. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:45 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
sergey113Из базы данных в формате gdb хочу сделать выборку клиентов у которых заполнены поля дня рождения и телефон. Работаю на Ubuntu 16.04 64-bit использую flamerobin. Делаю запрос на выборку всех данных: SELECT r.ID, r.FAM, r.IME, r.OTCH, r.ADRESS, r.DATE_BORN, r.TEL_MOB, r.GOROD, r.STREET, r.DOM, r.KORP, r.FLAT FROM PACIENT r Получается 10605 записей Делаю запрос с исключением пустых полей SELECT r.ID, r.FAM, r.IME, r.OTCH, r.ADRESS, r.DATE_BORN, r.TEL_MOB, r.GOROD, r.STREET, r.DOM, r.KORP, r.FLAT FROM PACIENT r where r.DATE_BORN is not null or r.TEL_MOB is not null Получается 9856 записей. Но сразу бросилось в глаза что это не так. Проверяю по отдельности запросами вида SELECT r.ID, r.FAM, r.IME, r.OTCH, r.ADRESS, r.DATE_BORN, r.TEL_MOB, r.GOROD, r.STREET, r.DOM, r.KORP, r.FLAT FROM PACIENT r where r.DATE_BORN is null и вижу, что по отдельности выбирает 3036 и 1573 записи. Ясно, что суммы не сходятся. А в чем тут подвох? r.DATE_BORN is not null: 10605-3036 записей. r.TEL_MOB is not null: 10605-1573 записей. r.DATE_BORN is not null or r.TEL_MOB is not null: от 10605-3036 до 10605 записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:51 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
sergey113, а может быть стоит просто понять логику NULL и не надо будет 100500 лишних шагов делать? sergey113Из базы данных в формате gdb хочу сделать выборку клиентов у которых заполнены поля дня рождения и телефон. научись переводить свои формулировки в язык логики. Говоришь заполнены поля дня рождения и телефон, а в запросе пишешь OR. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 16:53 |
|
Исключение из запроса полей с нулевым знаечением - некорректный результат? ubunu+flamerob
|
|||
---|---|---|---|
#18+
Согласен с критикой. Мысли излагаю часто криво, потому что мыслю так. Спасибо за помощь. Куда мне двигаться понял. Единственное, что на данный момент нужно освосить isql. Если не найди в нете создам отдельную тему. Спасибо за помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2016, 17:39 |
|
|
start [/forum/topic.php?fid=40&msg=39259087&tid=1562083]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 164ms |
0 / 0 |