Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2012, 22:35   #1
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
Вопрос Можно ли как-то сделать if для join в FB2.5?

Может кто осилит такую задачу...
1. В БД есть небольшая ХП "SP", которая получая один параметр "Param1" ищет соответствия в TableS и возвращает список ID строк значения которых удовлетворяют запросу Param1. Но, в этой ХП в начале есть проверка на условие типа if Param1=TableP.Field1 then вернуть все значения TableS без проверки на соответствие. Иначе SP может вернуть некий список удовлетворяющий запросу или даже пустой спсок, если соответствий не найдено.
2. Другие ХП используют SP так:
select *
from TableX
inner join SP (Param1) on TableX.id=SP.id
Таким образом из TableX выбираются строки ID которых равны результату SP.

Но, что получается - если в SP сработала проверка [if Param1=TableP.Field1 then вернуть все значения TableS] SP должна вернуть все значения TableS чтобы работала эта конструкция - но в этом случае в п.2 нет никакого смысла в строке [inner join SP (Param1) on TableX.id=SP.id] тк в п.2 результатом и с inner join и без него будут ВСЕ строки TableX!

Вопрос - можно ли как-то сделать, чтобы если в SP Param1 удовлетворил первой проверке и SP должно вернуть всю TableS - вообще отключить/пропустить в п.2 функцию inner join чтобы не делать этого лишнего объединения?

Пробовал в ХП из п.2 в секцию from-join добавить case/if - но FB ругается, нельзя так, говорит. Поэтому создал такую конструкцию, тк SP возвращает не слишком много строк (до 100шт), затраты при малом кол-ве данных в БД небольшие, но всё же как-то кривовато.

Логика всей конструкции работать должна так:
select *
from TableX
case not Param1=TableP.Field1 then inner join SP (Param1) on TableX.id=SP.id end

Есть соображения как можно это порешать?

Последний раз редактировалось DeveloPerchik; 09.04.2012 в 22:47.
DeveloPerchik вне форума Ответить с цитированием
Старый 10.04.2012, 01:21   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

execute block в помощь
Прик вне форума Ответить с цитированием
Старый 10.04.2012, 01:27   #3
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

И что? EB даёт возможность исполнять из программы кусок SQL, а тут вопрос - как сам SQL написать-то ???
DeveloPerchik вне форума Ответить с цитированием
Старый 10.04.2012, 01:33   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

execute block можно назвать "ХП на выезде".
Позволяет в своих рамках выполнять что угодно, любые конструкции SQL. Точно также как и в ХП.
Почему не сделать, если не получается в одном, два разных запроса, которые будут выполняться по условию.
Прик вне форума Ответить с цитированием
Старый 10.04.2012, 10:56   #5
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

И так уже два запроса - две ХП. Никаких преимуществ в данном вопросе EB не даёт.
Ещё раз - вопрос темы - как правильно написать SQL код с возможностью делать и не делать inner join ???
DeveloPerchik вне форума Ответить с цитированием
Старый 10.04.2012, 11:14   #6
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

Конструкция вида:
Код:
if Param1=TableP.Field1 then
  select *
  from TableX
  inner join SP (Param1) on TableX.id=SP.id
end else
  select *
  from TableX
end
...не подходит, тк в блоке from-join может быть очень много join таблиц, положим 10шт. Среди которых положим 5 с использованием SP. Таким образом в таком стиле конструкции потребуется описать 25 вариантов! Это криво.
DeveloPerchik вне форума Ответить с цитированием
Старый 10.04.2012, 11:32   #7
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

в FB конструкция типа:
Код:
  select *
  from TableX
  inner join SP (Param1) on TableX.id=SP.id and (not Param1=(select Field1 from TableP where Param=Param1))
должна ли работать вообще? и если да, то в случае неудовлетворения второму условию - inner join вообще не будет или будет пустой? какое поведение ожидать?
DeveloPerchik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
можно ли писать php код внутри javascript инструкции if? если можно, то как это сделать? Ubihinon JavaScript, Ajax 2 20.02.2012 08:40
можно ли писать php код внутри javascript инструкции if? если можно, то как это сделать? Ubihinon PHP 2 18.02.2012 17:45
Как можно сделать? cargo29 Работа с сетью в Delphi 6 18.03.2011 22:38
Хочу сделать форму для ввода паролей! Для этого текст должен быть зашифрован в (*****) ! Как сделать vitaaly Visual C++ 2 12.02.2011 12:29
КАк сделать JOIN в Access с объединением по NULL Izhic Помощь студентам 1 09.02.2011 11:18