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

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

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2012, 17:03   #1
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию if

Всем привет!
Простенькая задача довела до бешенства (бьюсь головой обо все что рядом), вроде все должно работать а нифига не работает.
Если максимально упростить то есть Таблица, Поле1 и Поле2. Нужно если Поле2 не равно Null прибавить его к Поле1 иначе прибавить к Поле1 0 (ноль) или вообще ничего не прибавлять.
Вроде все просто
Код:
IF (Таблица.Поле2 is not null )  
			 SELECT Таблица.Поле1+Таблица.Поле2  FROM Таблица;
	else
			 SELECT Таблица.Поле1+0  FROM Таблица;
А не работает, подскажите пожалуйста где ашипка. (вариантов с написанием этого отрезка кода перепробовал кучу но постоянно какието ашипки, наверное всетаки придется почитать какюнибудь книжку по sql)
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 26.07.2012, 17:06   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
SELECT Таблица.Поле1+COALESCE(Таблица.Поле2,0)  FROM Таблица
Не спасет? Это для MS SQL. Для других ищите аналоги
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.07.2012, 17:21   #3
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Спасибо большое! Функция очень сильно упростила, общую задачу не пришлось с ифами мудрить.
Все же интересно в чем ошибка в моем коде?
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 26.07.2012, 17:37   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
IF (Таблица.Поле2 is not null )
Откуда возьмется?
+ точек с запятой лишних понаставили
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.07.2012, 19:49   #5
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Может я уже достал )) Но хочется разобраться
попробовал так
Код:
IF (Таблица.Поле2 from Таблица is not null )  
			 SELECT Таблица.Поле1+Таблица.Поле2  FROM Таблица
	else
			 SELECT Таблица.Поле1+0  FROM Таблица
ошибка
Попробовал так
Код:
IF (SELECT Таблица.Поле2 from Таблица ) is not null  
			 SELECT Таблица.Поле1+Таблица.Поле2  FROM Таблица
	else
			 SELECT Таблица.Поле1+0  FROM Таблица
тоже ошибка
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 26.07.2012, 19:57   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Таблица.Поле2 from Таблица is not null
Это что? Нет такой команды в SQL
Цитата:
SELECT Таблица.Поле2 from Таблица
Возвращает множество значений, какое из них is not null?
Синтаксис IF http://msdn.microsoft.com/ru-ru/library/ms182717.aspx
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.07.2012, 10:38   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Atenon, Ваша проблема в том, что Вы не понимаете одной простой-простой вещи - вам нужно обработать не одну запись - а НАБОР!
тот подход, который Вы пытаете реализовать допустим ТОЛЬКО если в IF будет доступ одной (к I-й, условно говоря) записи.
ну, допустим, есть набор данных в таблице
если мы можем написать
Код:
цикл пока не дошли до конца таблицы
  IF Поле2 (текущее значение) is null then 
      Поле1 + 0...
  else
      Поле1 + Поле2

  ПерейтиНаСледующуюЗапись в Таблице
конец цикла
но это АБСОЛЮТНО не нужно!
запрос уже предоставил вам ВСЕ записи - нужно только их обработать по одной.

к идеальному варианту Аватар (Поле1 + coalsesce(Поле2, 0)
добавлю ещё варианты.
Привожу их исключительно для того, чтобы Вы разобрались в том, что недопонимаете...

Вариант 1. Разделим обработку записей Поле2 NULL и не NULL:
Код:
SELECT Таблица.Поле1+Таблица.Поле2 AS SummaPoley  
   FROM Таблица where  Таблица.Поле2 is NOT NULL
UNION ALL
SELECT Таблица.Поле1+0 AS SummaPoley  
   FROM Таблица where  Таблица.Поле2 is NULL
вариант 2.
очень близок к варианту, предложенному Аватар.
и, по сути - это то, что Вы хотели написать с помощью IF:
суть в том, что для каждой записи в селекте мы проверяем поле2 - если оно NULL - возвращаем значение 0, если не NULL - возвращаем значение поля2:
Код:
SELECT Таблица.Поле1+
    case when Таблица.Поле2 is NULL then 0 else Таблица.Поле2 end
              AS SummaPoley  
    FROM Таблица
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.08.2012, 20:18   #8
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию

Cпасибо за разъяснение очень помогло. Действительно вся путаница в голове возникает из за того что работа происходит с набором данных, надо потренироваться с запросами, недооценил специфику работы sql думал по ходу дела быстро разберусь.
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 05.08.2012, 23:54   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Ага. Ничего, это прийдёт со временем и с опытом.

В качестве азбуки SQL могу порекомендовать книжку Мартина Грубера - "Понимание SQL".
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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