powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Произведение ненулевых столбцов
14 сообщений из 14, страница 1 из 1
Произведение ненулевых столбцов
    #35623096
nastasjal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль (например если 2 0 3 то произведение будет 6). Можно ли это как-либо написать sql-запросом? Просто иначе выпоолняется все очень долго.
Подскажите пожалуйста!
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35623111
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Select (Iif(fld1=0,1,fld1)*Iif(fld2=0,1,fld2)*Iif(fld3=0,1,fld3)) as some_name From....
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35623147
nastasjal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое. Получилось!!!!!!
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35623314
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если все столбцы = 0 ?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35623550
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В версии VFP8 введена функция EVL(), которая возвращает первое значение отличное от EMPTY(). Для числовых значений 0 и есть пустое значение. Т.е. выражение можно записать короче

Код: plaintext
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 ) as newField
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35623628
гость...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 )*iif(fld1+fld2+fld3= 0 , 0 , 1 ) 
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35623738
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гость...
Код: plaintext
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 )*iif(fld1+fld2+fld3= 0 , 0 , 1 )

Это не сработает, если поля могут принимать отрицательные значения.

В общем случае, выражение от набора полей не поможет определить пустоту каждого поля в отдельности. В принципе, можно написать так

Код: plaintext
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 )*abs(sign(EVL(fld1,EVL(fld2,fld3)))) as newField

или так

Код: plaintext
EVL(fld1, 1 )*EVL(fld2, 1 )*EVL(fld3, 1 )*iif(fld1= 0  AND fld2= 0  AND fld3= 0 ,  0 ,  1 ) as newField

Насколько понимаю, вариант, когда два поля из трех пустые, специально рассматривать не имеет смысла.
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35624128
FAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это точно работает:

select nvl(fld1,100) as F1, nvl(fld2,5) as F2, nvl(fld1,12) as F3 from DUAL into table AAA
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35624329
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FAMЭто точно работает:

select nvl(fld1,100) as F1, nvl(fld2,5) as F2, nvl(fld1,12) as F3 from DUAL into table AAA
Вы путаете понятия "пустое значение" и значение NULL. Это "две большие разницы".

NULL - это не известное значение. В данном случае, неизвестно равно оно нулю или нет.
Пустое - это вполне определенное значение. В данном случае, как раз и равное нулю.

NVL() - проверка на значение NULL
EVL() - проверка на пустое значение. Для чисел, проверка на значение 0.
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35625562
beginner_foxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nastasjalУ меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль (например если 2 0 3 то произведение будет 6). Можно ли это как-либо написать sql-запросом? Просто иначе выпоолняется все очень долго.
Подскажите пожалуйста!

Код: plaintext
1.
2.
select icase(a= 0 , 1 ,a)*icase(b= 0 , 1 ,b)*icase(c= 0 , 1 ,c)
from MyTable
where a <> 0  and b<> 0  and c<> 0 
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35625720
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beginner_foxxnastasjalУ меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль (например если 2 0 3 то произведение будет 6). Можно ли это как-либо написать sql-запросом? Просто иначе выпоолняется все очень долго.
Подскажите пожалуйста!
Код: plaintext
1.
2.
select icase(a= 0 , 1 ,a)*icase(b= 0 , 1 ,b)*icase(c= 0 , 1 ,c)
from MyTable
where a <> 0  and b<> 0  and c<> 0 

Не то, чтобы данный код был совсем уж бессмысленным, но он, во-первых, избыточный, а, во-вторых, не решает поставленную задачу.

Условие

where a<>0 and b<>0 and c<>0

означает, что ВСЕ поля одновременно отличны от 0. Нет смысла сравнивать значения с нулем, если все нулевые значения уже отсечены. Возможно, здесь предполагалось OR вместо AND? Т.е. надо бы писать

where a<>0 or b<>0 or c<>0

Тогда смысл появляется. Это условие отсекает только те записи, у которых все поля равны нулю. Однако из постановки задачи не ясно, а надо ли их отсекать? Или оставить, но установить значение выражения равным 0?

А насчет избыточности...

icase() все-таки предполагает наличие нескольких последовательных условий. Если надо проверить всего-лишь одно, то почему недостаточно iif()? А если проверка на пустое значение, то почему не использовать EVL()?
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35625789
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно я тоже свой изврат предложу:
Код: plaintext
EVL(a*b*c, EVL(a*b, EVL(a*c, EVL(b*c, EVL(a, EVL(b, EVL(c, NULL)))))))

PS Автор топика похоже давно проблему порешал и другими занимается.
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35626220
beginner_foxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМbeginner_foxx[quot nastasjal]У меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль (например если 2 0 3 то произведение будет 6). Можно ли это как-либо написать sql-запросом? Просто иначе выпоолняется все очень долго.
Подскажите пожалуйста!
Код: plaintext
1.
2.
select icase(a= 0 , 1 ,a)*icase(b= 0 , 1 ,b)*icase(c= 0 , 1 ,c)
from MyTable
where a <> 0  and b<> 0  and c<> 0 


авторНе то, чтобы данный код был совсем уж бессмысленным, но он, во-первых, избыточный, а, во-вторых, не решает поставленную задачу.
Не соглашусь :-))

nastasjal
У меня в программе надо считать произведение 3-х столбцов при условии что элемент не ноль

Код: plaintext
1.
2.
Условие 
where a<> 0  and b<> 0  and c<> 0 
означает, что ВСЕ поля одновременно отличны от  0 . Нет смысла сравнивать значения с нулем, если все нулевые значения уже отсечены.
Это сделанно чтобы результат произведения трех нулей не попал в выборку-по условию.
Код: plaintext
1.
2.
 Возможно, здесь предполагалось OR вместо AND? Т.е. надо бы писать
where a<> 0  or b<> 0  or c<> 0 
Тогда смысл появляется. Это условие отсекает только те записи, у которых все поля равны нулю. 
Можно и так :-)

авторicase() все-таки предполагает наличие нескольких последовательных условий. Если надо проверить всего-лишь одно, то почему недостаточно iif()? А если проверка на пустое значение, то почему не использовать EVL()?
icase ближе к стандарту спецификации SQL case-конструкции , но как говориться на вкус и цвет товарищей нет
...
Рейтинг: 0 / 0
Произведение ненулевых столбцов
    #35627004
beginne_fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ
Условие
where a<>0 and b<>0 and c<>0
означает, что ВСЕ поля одновременно отличны от 0. Нет смысла сравнивать значения с нулем, если все нулевые значения уже отсечены. Возможно, здесь предполагалось OR вместо AND? Т.е. надо бы писать
where a<>0 or b<>0 or c<>0
Тогда смысл появляется. Это условие отсекает только те записи, у которых все поля равны нулю. Однако из постановки задачи не ясно, а надо ли их отсекать? Или оставить, но установить значение выражения равным 0?

Да, Вы правы.
Я хотел отсечь записи, у которых все поля равны нулю, надо писать именно так
where a<>0 or b<>0 or c<>0
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Произведение ненулевых столбцов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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