Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Построить запрос / 18 сообщений из 18, страница 1 из 1
10.09.2003, 18:39
    #32261625
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Хочется написать запрос кот. содержал-бы описание местонахождения объекта.
Варианты:
- между Улица1 дом1 копр1 и Улица2 дом2 копр2
- угол Улица1 дом1 копр1 и Улица2 дом2 копр2
- просто Улица1 дом1 копр1

Есть такой вариант:
SELECT
NEWBUILDLIST.BETW || NEWBUILDLIST.CONER || ' ' || STREETONE.STREETNAME ||
NEWBUILDLIST.DOM1 || '/' || NEWBUILDLIST.KORP1 || ' и '
|| STREETTOW.STREETNAME || NEWBUILDLIST.DOM2 || '/' || NEWBUILDLIST.KORP2
FROM NEWBUILDLIST
INNER JOIN CITY ON (NEWBUILDLIST.CITY_ID = CITY.CITY_ID)
INNER JOIN DISTRICT ON (NEWBUILDLIST.DISTRICT_ID = DISTRICT.DISTRICT_ID)
INNER JOIN MSTATION ON (NEWBUILDLIST.MSTATION_ID = MSTATION.MSTATION_ID)
INNER JOIN MSTILE ON (NEWBUILDLIST.MSTILE_ID = MSTILE.MSTILE_ID)
INNER JOIN TBUILDING ON (NEWBUILDLIST.TBUILDING_ID = TBUILDING.TBUILDING_ID)
INNER JOIN STREET STREETONE ON (NEWBUILDLIST.STREET1 = STREET.STREET_ID)
INNER JOIN STREET STREETTOW ON (NEWBUILDLIST.STREET2 = STREET.STREET_ID)

Но есть проблема:
если хоть одно поле содержит null то тогда всё получается null. А это неинтересно :(

Может кто-нить что подскажет?
...
Рейтинг: 0 / 0
11.09.2003, 02:21
    #32261749
Posco
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Используй UDF, которая будет возвращать отличное от NULL, если значение поля NULL
...
Рейтинг: 0 / 0
11.09.2003, 07:18
    #32261789
Denis Uskov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
>если хоть одно поле содержит null то тогда всё получается null.

В запрос не вникал, но для вывода всех записей нужно использовать:
LEFT, RIGHT или FULL JOIN в зависимости от того, что хочешь получить.
...
Рейтинг: 0 / 0
11.09.2003, 11:40
    #32262126
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Я просто немного неправильно привёл запрос. Вот более приемлимый вариант :)
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT 
NEWBUILDLIST.BETW || NEWBUILDLIST.CONER || ' ' || STREETONE.STREETNAME || 
NEWBUILDLIST.DOM1 || '/' || NEWBUILDLIST.KORP1 || ' и ' 
|| STREETTOW.STREETNAME || NEWBUILDLIST.DOM2 || '/' || NEWBUILDLIST.KORP2 
FROM NEWBUILDLIST 
INNER JOIN STREET STREETONE ON (NEWBUILDLIST.STREET1 = STREET.STREET_ID) 
INNER JOIN STREET STREETTOW ON (NEWBUILDLIST.STREET2 = STREET.STREET_ID) 

Мне кажется что LEFT, RIGHT или FULL JOIN здесь непричём. ситуация такая: street2, dom2, korp2 - могут незаполнятся, или например street2 и dom2 есть, а korp2 нет. И как только одно из этих полей незаполнено - выходит null :( заполнять пробелами тоже не катит хотябы потому, что street - это ссылка на справочник улиц

to Posco: А как пишутся эти ф-ции? Можешь дать какой-нить пример или ссылку толковую?
...
Рейтинг: 0 / 0
11.09.2003, 12:34
    #32262239
Denis Uskov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Тогда UDF
по IB есть хороший сайт http://www.ibase.ru
Для FB 1.5 есть встроенная функция не помню точно как называется что-то COALE...
...
Рейтинг: 0 / 0
11.09.2003, 13:23
    #32262340
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
А как передать в ф-цию Null?
...
Рейтинг: 0 / 0
11.09.2003, 13:45
    #32262385
Acue
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
...
Рейтинг: 0 / 0
11.09.2003, 13:55
    #32262405
Малиновский Владимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Чтобы в выходной набор попадали строки с Null -значениями в полях, используй OUTER JOIN

SELECT
NEWBUILDLIST.BETW, NEWBUILDLIST.CONER, STREETONE.STREETNAME, NEWBUILDLIST.DOM1, NEWBUILDLIST.KORP1, STREETTOW.STREETNAME, NEWBUILDLIST.DOM2, NEWBUILDLIST.KORP2
FROM NEWBUILDLIST
left outer JOIN STREET STREETONE ON (NEWBUILDLIST.STREET1 = STREET.STREET_ID)
left outer JOIN STREET STREETTOW ON (NEWBUILDLIST.STREET2 = STREET.STREET_ID)

А соединяй это безобразие в одну строку на клиенте, анализируя методом
IsNull, например
...
Рейтинг: 0 / 0
11.09.2003, 14:40
    #32262505
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
to Малиновский Владимир:
Спасибо. А что значит методом "IsNull"?
...
Рейтинг: 0 / 0
11.09.2003, 15:32
    #32262594
KiLLun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Если использовать FireBird 1.5 - там есть функция проверки на NULL
- COALESCE.
SELECT COALESCE(FIELD1,'---') FROM TABLE

Be Well...
...
Рейтинг: 0 / 0
11.09.2003, 15:39
    #32262608
Малиновский Владимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Ну, у потомков TDataSet (я надеюсь, ты какой-нибудь используешь) есть свойство Fields, к которые можно проверить на Null, например так:
MyDataSet.FieldByName('STREETNAME').IsNull

Можешь использовать UDF, правда, я не знаю, как там дела с Null - значениями параметров обстоят.
...
Рейтинг: 0 / 0
11.09.2003, 16:21
    #32262700
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
А может можно написать ХП которой передать все эти поля (благо там помоему есть проверка на Null) что-бы она возвращала уже собранное поле?
...
Рейтинг: 0 / 0
11.09.2003, 17:47
    #32262805
Малиновский Владимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Да, без проблем
...
Рейтинг: 0 / 0
11.09.2003, 18:08
    #32262834
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Может подскажешь? а то я пол-дня книгу читаю, но никак немогу сообразить.
8(
...
Рейтинг: 0 / 0
11.09.2003, 18:55
    #32262886
Acue
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
На основе твоего запроса получается что-то вроде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
create procedure MYPROC 
returns(mesto varchar(??? /*сколько у тебя там длина может быть*/ ))
as
declare variable vBETW varchar(???);
declare variable vCONER varchar(???);
declare variable vSTREETONE_STREETNAME varchar(???);
declare variable vDOM1 varchar(???);
declare variable vKORP1 varchar(???);
declare variable vSTREETTOW_STREETNAME varchar(???);
declare variable vDOM2 varchar(???);
declare variable vKORP2 varchar(???);
begin
for SELECT NEWBUILDLIST.BETW, NEWBUILDLIST.CONER,
           STREETONE.STREETNAME, NEWBUILDLIST.DOM1, NEWBUILDLIST.KORP1,
           STREETTOW.STREETNAME, NEWBUILDLIST.DOM2, NEWBUILDLIST.KORP2 
      FROM NEWBUILDLIST 
           INNER JOIN STREET STREETONE ON (NEWBUILDLIST.STREET1 = STREET.STREET_ID) 
           INNER JOIN STREET STREETTOW ON (NEWBUILDLIST.STREET2 = STREET.STREET_ID) 
      into :vBETW, :vCONER,
           :vSTREETONE_STREETNAME, :vDOM1, :vKORP1,
           :vSTREETTOW_STREETNAME, :vDOM2, :vKORP2 
   do begin
     mesto='';
     if (vBETW is not null) then mesto=mesto||vBetw;
     if (vCONER is not null) then mesto=mesto||vCONER;
     if (:vSTREETONE_STREETNAME is not null) 
       then mesto=mesto||' '||vSTREETONE_STREETNAME;
     if (vDOM1 is not null) then mesto=mesto||', '||vDOM1;
     if (vKORP1 is not null) then mesto=mesto||' / '||vKORP1;
     if (:vSTREETTOW_STREETNAME is not null) 
       then mesto=mesto||' и '||vSTREETTOW_STREETNAME;
     if (vDOM2 is not null) then mesto=mesto||', '||vDOM2;
     if (vKORP2 is not null) then mesto=mesto||' / '||vKORP2;
     suspend;
   end
end;
...
Рейтинг: 0 / 0
12.09.2003, 12:06
    #32263466
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
А почему эта процудера возвращает только одну строку из таблицы? или подругому никак?
...
Рейтинг: 0 / 0
12.09.2003, 12:15
    #32263488
Acue
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Если строка в вопросе = запись, то проверь сколько записей возвращает этот селект, используемый в процедуре (собственно твой приемлемый вариант):

SELECT NEWBUILDLIST.BETW, NEWBUILDLIST.CONER,
STREETONE.STREETNAME, NEWBUILDLIST.DOM1, NEWBUILDLIST.KORP1,
STREETTOW.STREETNAME, NEWBUILDLIST.DOM2, NEWBUILDLIST.KORP2
FROM NEWBUILDLIST
INNER JOIN STREET STREETONE ON (NEWBUILDLIST.STREET1 = STREET.STREET_ID)
INNER JOIN STREET STREETTOW ON (NEWBUILDLIST.STREET2 = STREET.STREET_ID)

Если строка в вопросе - это строковый выходной параметр процедуры, то ничего другого ты и не спрашивал (см. свой запрос).
...
Рейтинг: 0 / 0
12.09.2003, 12:32
    #32263531
Арнис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построить запрос
Всё! Разобрался :) Спасибо!
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Построить запрос / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]