Xpoint
   [напомнить пароль]

[Firebird 1.5] Выбрать непустые записи

Метки: [без меток]
2006-03-27 11:52:59 [обр] Роман Чемисов(0/350)[досье]

Неужели с Firebird всё так плохо и без UDF там никуда? У меня есть такой код:

CREATE TABLE "ADDR" 
(
  "WWW"   VARCHAR(50) CHARACTER SET WIN1251 DEFAULT '' NOT NULL COLLATE PXW_CYRL,
  "EMAIL"   VARCHAR(50) CHARACTER SET WIN1251 DEFAULT '' NOT NULL COLLATE PXW_CYRL,
  "_ID"   "IDENTIFIER",
CONSTRAINT "PK_ADDR" PRIMARY KEY ("_ID")
);

Мне нужно выбрать все записи, у которых есть WWW или EMAIL. Пробую так:

SELECT * 
FROM ADDR
WHERE ((WWW IS NOT NULL) OR (EMAIL IS NOT NULL));

Естественно получаю все записи (потому что они все NOT NULL). Соображаю, что у лишних записей по 50 пробелов. Но как их отсеять?
только чур

email != 'пятьдесят_пробелов'

не предлагать!
И самое главное: можно это сделать без UDF (только стандартными built-in средствами)?

спустя 31 минуту [обр] 30-ый(4/584)[досье]

Что-то я как-то совсем не понял проблемы. О каком "WHERE WWW IS NOT NULL" можно говорить, когда у вас все поля определены как "NOT NULL". Тогда что вы хотите отсеиять? Если пустые строки, то почему бы не так: trim(email) <> ''?

На сколько я понимаю - trim - это одна из стандартных UDF. Почему бы ей не воспользоваться?

спустя 7 минут [обр] Роман Чемисов(0/350)[досье]
30-ый[досье]
Function unknown -Trim, т. е. это нестандартная UDF (и это меня больше всего и бесит в Firebird!).
А про NULL, я об этом и говорил. Это было лирическое отступление :-)
спустя 18 минут [обр] 30-ый(4/584)[досье]

Цитата с http://www.sqlmanager.net/en/articles/ibfb/588:

InterBase also supplies the source to other sample UDFs in the examples directory. They are contained in the udflib.c file. The UDFs there are: lower, strcat, substr, trim, trunc, doy, moy, dow, sysdate, add2, mul, fact, abs, maxnum, sqrt, blob_linecount, blob_bytecount, substr_blob.

Т.е. функция очень даже стандартная, просто по умолчанию видимо не установлена. Ну так это часто так. Вон у Postgres 7.4 по умолчанию не было установленно ни одного языка хранимых процедур. Даже родного Pg/SQL не было. А MS-SQL начиная с версии 7.0 не включал по умолчанию "стандартную аутентификацию" (хотя в то время только эту аутентификацию и использовали). Можно рассматривать это как гемморой, можно как фичу...

спустя 7 минут [обр] Роман Чемисов(0/350)[досье]
30-ый[досье]
Ну с Postgres всё как-бы было понятно. И мне, например, на этапе установки предложили установить Pg/SQL (в Windows). А вот с Firebird какая-то засада.
спустя 33 минуты [обр] Дмитрий Кучкин(7/236)[досье]
Если вот так не работает, то Firebird очень странная СУБД
SELECT * 
FROM ADDR
WHERE ((WWW <> '') OR (EMAIL <> ''));
спустя 24 минуты [обр] 30-ый(4/584)[досье]

Ой. А где же это так работает? Если в записи лежат 50 пробелов, то они уж никак не равны ''.

Другой вопрос: как эти пробелы там появились? Я полагаю, что по недосмотру. Что-то не верю я в то, что это Firebird так реагирурует на DEFAULT '' NOT NULL

спустя 36 минут [обр] Дмитрий Кучкин(7/236)[досье]
Вот и я не верю. Не должен он поступать с VARCHAR как с CHAR. А строку пробелами вполне может добивать клиентская программа, поэтому и предложил попробовать очевидный запрос.
спустя 1 час 18 минут [обр] Роман Чемисов(0/350)[досье]
Дмитрий Кучкин[досье]
Нет, это, конечно же, не работает (там же всё-таки 50 пробелов).
Откуда они там взялись? Видимо их туда запихало клиентское приложение. Это не моё приложение, я всего лишь хочу написать небольшой email и www чеккер.
спустя 3 минуты [обр] Роман Чемисов(0/350)[досье]
30-ый[досье]
Скорее всего их туда запихало клиентское приложение. Видимо оно так реагирует на пустое (незаполненное) поле email.
Попутно вопрос: для email поля лучше убрать NOT NULL (и оставлять NULL, когда email не указан) или всё-таки оставить как есть?
спустя 3 минуты [обр] Роман Чемисов(0/350)[досье]
Что меня больше всего бесит в Firebird — полное отсутствие документации (я, конечно, понимаю, что ребята на этом денежку зарабатывают). Но... если сравнивать с PostgreSQL, то это как небо и земля. Там просто тонны документации. Всё сразу понятно и просто. И денежку они тоже зарабатывают.
спустя 51 минуту [обр] 30-ый(4/584)[досье]

Если поле может быть пустым, то я предпочитаю делать его NULLABLE... хотя это дело вкуса.

P.S. Документация к PostgreSQL надо заметить ужасна... руки бы оторавл, ей богу. Иногда я думаю, что лучше бы ее вообще в online не было. Я бы быстрее книжку купил и не мучился с этим кошмаром.

спустя 10 минут [обр] fetis(0/82)[досье]

На ibase.ru тонны документации по FB. Для начальных сведений можно воспользоваться документацией по Interbase 6 (берется там же). Вопросы можно задать в специальной конференции. Лучшее средство для работы с FB, на мой взгляд, IBExpert.

Относительно вашего вопроса. Я создал таблицу, анаолгичную вашей и забил в нее тестовые данные

create table ADDR (
  ID integer,
  WWW varchar(50) character set WIN1251 default '' not null collate PXW_CYRL,
  EMAIL varchar(50) character set WIN1251 default '' not null collate PXW_CYRL,
  constraint PK_ADDR primary key (ID)
);

insert into addr (id) values (1);
insert into addr (id) values (2);
insert into addr (id) values (3);
insert into addr values (4, 'test.ru', 'info@site.com');

Запрос

select *
  from ADDR
  where (WWW <> '') and (EMAIL <> '')

правильно возвращает одну строку, так что Firebird здесь абсолютно не причем, ищитe грабли в др. месте.

спустя 5 минут [обр] fetis(0/82)[досье]
Маленькая ошибочка закралась, правильно будет
  ID integer not null,
спустя 14 часов [обр] Роман Чемисов(0/350)[досье]
fetis[досье]
Спасибо. Действительно работает. Видимо, хранит-то он их без пробелов, но при выводе (в текстовый файл) заменяет почему-то '' на 'пятьдесят_пробелов'.
Попутно возник вопрос: чем <> отличается от !=?
спустя 4 часа 43 минуты [обр] 30-ый(4/584)[досье]

Ну это вполне объяснимо, что при выводе в текстовый файл строки имеют максимальную длину. Даже если файл делит столбцы запятыми, подобный документ было бы значительно проще читать в текстовом редакторе, нежели с полями переменной длины.

<> это согласно SQL-стандарту, а != видимо самодеятельность разработчиков.

спустя 8 минут [обр] fetis(0/82)[досье]

Заменяет клиентская программа, FB здесь абсолютно не при чем.

Разницы вроде никакой, и тот, и тот работают одинаково.

спустя 35 минут [обр] Роман Чемисов(0/350)[досье]
Всем спасибо. Я доволен :-)
Powered by POEM™ Engine Copyright © 2002-2005