powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Построить запрос
18 сообщений из 18, страница 1 из 1
Построить запрос
    #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
Построить запрос
    #32261749
Posco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй UDF, которая будет возвращать отличное от NULL, если значение поля NULL
...
Рейтинг: 0 / 0
Построить запрос
    #32261789
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>если хоть одно поле содержит null то тогда всё получается null.

В запрос не вникал, но для вывода всех записей нужно использовать:
LEFT, RIGHT или FULL JOIN в зависимости от того, что хочешь получить.
...
Рейтинг: 0 / 0
Построить запрос
    #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
Построить запрос
    #32262239
Denis Uskov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда UDF
по IB есть хороший сайт http://www.ibase.ru
Для FB 1.5 есть встроенная функция не помню точно как называется что-то COALE...
...
Рейтинг: 0 / 0
Построить запрос
    #32262340
Арнис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как передать в ф-цию Null?
...
Рейтинг: 0 / 0
Построить запрос
    #32262385
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Построить запрос
    #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
Построить запрос
    #32262505
Арнис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Малиновский Владимир:
Спасибо. А что значит методом "IsNull"?
...
Рейтинг: 0 / 0
Построить запрос
    #32262594
Фотография KiLLun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если использовать FireBird 1.5 - там есть функция проверки на NULL
- COALESCE.
SELECT COALESCE(FIELD1,'---') FROM TABLE

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

Можешь использовать UDF, правда, я не знаю, как там дела с Null - значениями параметров обстоят.
...
Рейтинг: 0 / 0
Построить запрос
    #32262700
Арнис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может можно написать ХП которой передать все эти поля (благо там помоему есть проверка на Null) что-бы она возвращала уже собранное поле?
...
Рейтинг: 0 / 0
Построить запрос
    #32262805
Малиновский Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, без проблем
...
Рейтинг: 0 / 0
Построить запрос
    #32262834
Арнис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может подскажешь? а то я пол-дня книгу читаю, но никак немогу сообразить.
8(
...
Рейтинг: 0 / 0
Построить запрос
    #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
Построить запрос
    #32263466
Арнис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему эта процудера возвращает только одну строку из таблицы? или подругому никак?
...
Рейтинг: 0 / 0
Построить запрос
    #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
Построить запрос
    #32263531
Арнис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё! Разобрался :) Спасибо!
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Построить запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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