Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос с вычислением [D7]


DimDim ©   (2006-07-19 22:08:00) 

Уважаемые Мастера, что-то я перегрелся! Помогите разобраться.
Есть две таблицы, по которым составлен запрос с вычисляемым полем.
Tab1
Kod Kol
1 100
2 150
3 200
Tab2
Kod Reliz
1 20
3 30

Запрос:
SELECT
 Tab1.Kod,  Tab1.Kol,  Tab2.Reliz,
   (Tab1.Kol - Tab2.Reliz) AS Ostatok
FROM
 Tab1LEFT OUTER JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)


дает результат:
Kod Kol Reliz Ostatok
1 100 20 80
2 150 Null Null
3 200 30 170

Как сделать, чтобы во 2-й строке место Null были реальные числа ( т.е. 0 и 150 )?
Заранее благодарен.


sniknik   (2006-07-26 11:58:00) [1]

> Еще один вариант: ...

> Базы DBISAM используют собственный движок (компилируется в саму программу). Построение запросов полностью
>  соответствует Local SQL.

в локал sql нет контрукции IF(... THEN ... ELSE ...), значит или не полностью соотствует или не будет работать.


ЮЮ   (2006-07-26 11:57:00) [2]

IF (Tab2.Reliz = Null
THEN Tab1.Kol  ELSE (Tab1.Kol - Tab2.Reliz) )AS Ostatok

Странный синтаксис. Это где такой используется?
В Local SQL   IF THEN ELSE никаких нет
В других, известных мне,  Tab2.Reliz = Null  всегда даст FALSE


DimDim   (2006-07-26 11:51:00) [3]

Еще один вариант:

SELECT Tab1.Kod, Tab1.Kol, Tab2.Reliz,
 IF(Tab2.Reliz = Null
 THEN Tab1.Kol  ELSE (Tab1.Kol - Tab2.Reliz)) AS Ostatok
FROM
Tab1 LEFT OUTER JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)


ЮЮ   (2006-07-20 11:16:00) [4]

1)
Выкинуть (Tab1.Kol - Tab2.Reliz) AS Ostatok из запроса, сделав вычислимым полем.
0 в Reliz можно получить также в доп.вычислимом поле.

если всеже хочется в запросе, то:

SELECT
Tab1.Kod,  Tab1.Kol,  Tab2.Reliz,  (Tab1.Kol - Tab2.Reliz) AS Ostatok
FROM
Tab1
JOINTab2 ON (Tab1.Kod = Tab2.Kod)

 /* выбираем лишь те строки, для которых существует парав Tab2 */

UNION

SELECT
 Tab1.Kod,  Tab1.Kol,  0,  Tab1.Kol
FROM
 Tab1
 LEFT JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)
WHERE
 Tab2.Kod IS NULL

/* выбираем лишь те строки, для которых нет парыв Tab2 */

0 возможно потребуется явно привести к типу поля Tab2.Reliz, если возниккнет ошибка приведенеи типов


Johnmen   (2006-07-20 00:31:00) [5]

>[6]

UPDATE Table SET Field=0 WHERE Field IS NULL


DimDim   (2006-07-20 00:24:00) [6]

Дык, я и спрашиваю как в это сделать в одном запросе?
В принципе, я уже решил проблему через временную таблицу. Т.е. сначала делается запрос с созданием набора данных, а потом запрос на его изменение по определенным условиям.
Через ж..., конечно, но работает.


Johnmen   (2006-07-20 00:02:00) [7]

Тогда универсальное решение - заменить в таблице все null на 0 для соотв.полей.


DimDim   (2006-07-19 23:54:00) [8]

Базы DBISAM используют собственный движок (компилируется в саму программу). Построение запросов полностью соответствует Local SQL.


Johnmen   (2006-07-19 23:45:00) [9]

а движок?


DimDim   (2006-07-19 23:30:00) [10]

Базы DBISAM. Аналогично Paradox, dBASE.


Johnmen   (2006-07-19 23:28:00) [11]

реальность зависит от СУБД.


sniknik   (2006-07-19 22:58:00) [12]

> чтобы во 2-й строке место Null были реальные числа
надо их туда реально подставить если null...

p.s. реальность зависит от движка.


Наверх

Титульная страница Поиск, карта сайта Написать письмо