Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Суммирование поля типа bool


Автор: lightforever 11.3.2010, 10:58
Как просуммировать в столбце значения типа bool?

Автор: Akina 11.3.2010, 11:02
Да? а что получится, к примеру, если сложить 2*True+3*False? И главное - почему?
Бред какой-то...

Автор: tusha 11.3.2010, 13:07
Код

declare @x as bit
set @x=0
select @x+1

однако это возможно изза того, что бит это посути урезаный инт.
может имелось ввиду булева алгебра?  smile 

Автор: Invisible_kid 11.3.2010, 13:48
Цитата(Akina @  11.3.2010,  11:02 Найти цитируемый пост)
Да? а что получится, к примеру, если сложить 2*True+3*False? И главное - почему?

подобная операция полагаю вернула бы 2 smile

з.ы.: то что бред согласенsmile

Автор: Akina 11.3.2010, 13:55
Цитата(Invisible_kid @  11.3.2010,  14:48 Найти цитируемый пост)
подобная операция полагаю вернула бы 2

Это неверный ответ.

Автор: Invisible_kid 11.3.2010, 14:15
Цитата(Akina @  11.3.2010,  13:55 Найти цитируемый пост)
Это неверный ответ. 

ну тогда смотря гдеsmile

Автор: tusha 11.3.2010, 14:17
Код

declare @x as bit, @y as bit
select @x=1, @y=0 // TRUE , FALSE
select CONVERT(bit, 3*convert(tinyint,@x)+2*CONVERT(tinyint,@y))


результат = 1 т.е. TRUE
 smile 

Автор: Invisible_kid 11.3.2010, 14:22
Цитата(tusha @  11.3.2010,  14:17 Найти цитируемый пост)
результат = 1 т.е. TRUE

а вдруг хочется не булевый результат? smile 


Автор: tusha 11.3.2010, 14:25
имхо, как правильно сказал тов. Akina, арифметические операции над булевыми типами это бред

Автор: Invisible_kid 11.3.2010, 14:27
и в самом делеsmile хватит дурью маятсяsmile

Автор: Akina 11.3.2010, 15:06
Цитата(Invisible_kid @  11.3.2010,  15:15 Найти цитируемый пост)
ну тогда смотря где 

Не поленись посмотреть, в какой форме хранятся True и False. Для любого языка, СУБД и пр. Выяснится, что ВЕЗДЕ твой ответ неверен.

Автор: Invisible_kid 11.3.2010, 20:32
я к тому что в тех же сях true/false могут восприниматься как 1/0 [и соответственно есть возможность использовать булевые результаты в математических выражениях]

не поленился:
билдер скушал следующий кусочек за милу душу:
Код

int i;
i = 2*true + 3*false;

и результатом вернул "2"

Автор: Akina 11.3.2010, 21:42
Цитата(Invisible_kid @  11.3.2010,  21:32 Найти цитируемый пост)
в тех же сях true/false могут восприниматься как 1/0 

В данном случае выполняется неявное преобразование true в единицу. Тебе просто повезло. Ибо по классике true AND x = x и false AND x = false, откуда следует, что у false все биты нулевые, а у true единичные (т.е. при интерпретации как int получается не единица, а минус единица). Такое преобразование может запросто оказать программисту "медвежью услугу".

Автор: Invisible_kid 11.3.2010, 22:39
то что неявно преобразуются это понятно, 
я и говорю что просто есть такая возможность, а вот что пользоваться этим в определенных условиях может оказаться опасным это другое дело

Автор: Zloxa 12.3.2010, 09:30
Цитата(Akina @  11.3.2010,  21:42 Найти цитируемый пост)
откуда следует

ну.... не совсем следует.... либо даже вовсе не следует.
Логический And и побитовый and это разные операциии. А в том же Цэ, они и кодируются по разному. & vs && smile 

Автор: Akina 12.3.2010, 21:10
Цитата(Zloxa @  12.3.2010,  10:30 Найти цитируемый пост)
Логический And и побитовый and это разные операциии.

Логический - это всего лишь частный случай побитового - когда операнды приводятся к однобитовому виду по простому правилу "если есть хотя бы один единичный бит, то 1, иначе 0", верно? и результат соответственно однобитовый, который потом может расширяться до требуемого.
Так вот - я как раз говорю о том, что имеет место то, что я лично считаю ошибкой. Возьми любое расширение операнда - те же инструкции процессора cbw, cwd... чем выполняется расширение? старшим битом... именно так и должно было быть реализовано расширение однобитового операнда до любого бОльшего... а что сделали авторы? любые другие операнды (short, int, ...) расширяют правильно, а вот однобитовый почему-то всегда нулём. Ни логики, нии чего-то ещё - вот так левая пятка захотела. А у программистов это превращается в догму на одном языке и соответственно выглядит бредом на других.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)