![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос с вычислением [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. реальность зависит от движка.