Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Значение числа в степени ноль вдруг не равно единице  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Обычное int поле без NULL.
select ЭтоПоле^0 возвращает его же, а должно все числа не равные нулю показывать как 1, а 0 оставлять как 0.
13 май 13, 09:59    [14285993]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Денис Б.
Обычное int поле без NULL.
select ЭтоПоле^0 возвращает его же, а должно все числа не равные нулю показывать как 1, а 0 оставлять как 0.
По-Вашему, оператор "^" - это что такое?

На самом-то деле это битовый оператор "исключающее или".
Для степени числа есть функция POWER()
13 май 13, 10:03    [14286027]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
iap,
POWER(ПолеСнулями,0) для нулей возвращает тоже 1, хотя везде это 0 или неопределённость.

Я хотел по входящему параметру (@p int --Все = 0, ТолькоСлюбымиКромеНулей = 1, ТолькоСнулями=2)

в условии where поставить что-то типа
Поле = (case when @p = 0 then Поле else (case when @p = 1 then 1 else 0 end) end) --пример для битового поля. Я хотел подобным образом преобразовать не нулевые значения в единички
13 май 13, 11:09    [14286352]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Денис Б.
POWER(ПолеСнулями,0) для нулей возвращает тоже 1, хотя везде это 0 или неопределённость
не везде
13 май 13, 11:16    [14286385]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Денис Б.
iap,
POWER(ПолеСнулями,0) для нулей возвращает тоже 1, хотя везде это 0 или неопределённость.

Я хотел по входящему параметру (@p int --Все = 0, ТолькоСлюбымиКромеНулей = 1, ТолькоСнулями=2)

в условии where поставить что-то типа
Поле = (case when @p = 0 then Поле else (case when @p = 1 then 1 else 0 end) end) --пример для битового поля. Я хотел подобным образом преобразовать не нулевые значения в единички
Может, просто SIGN() сгодится?

Ваш CASE можно написать короче:
Поле = case @p when 0 then Поле when 1 then 1 else 0 end
13 май 13, 11:18    [14286389]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
iap,
SIGN просто прекрасно подходит, т.к. в моём случае в поле только положительные значения.
спасибо
13 май 13, 11:26    [14286426]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
Решено.

Если в столбце только значения >=0,то

Sign(Поле)=(case @p when 0 then Sign(Поле) when 1 then 1 else 0 end)

я думаю производительность тоже не страдает
13 май 13, 11:31    [14286476]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Денис Б.
Sign(Поле)=(case @p when 0 then Sign(Поле) when 1 then 1 else 0 end)

я думаю производительность тоже не страдает
Вообще-то, это гарантированный скан индекса, если он у вас есть по этому Полю.
13 май 13, 11:40    [14286551]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Денис Б.
Решено.

Если в столбце только значения >=0,то

Sign(Поле)=(case @p when 0 then Sign(Поле) when 1 then 1 else 0 end)

я думаю производительность тоже не страдает
Так это у Вас сравнение поля с неким значением в WHERE было написано?!
Вы только что пригворили индекс по [Поле].
Лучше всего, видимо, так:
SELECT ... FROM ... WHERE @p=0
UNION ALL
SELECT ... FROM ... WHERE @p=1 AND Поле>0
UNION ALL
SELECT ... FROM ... WHERE (@p IS NULL OR @p NOT IN(0,1)) AND Поле=0;
Или, если всё это в процедуре, написать IF с условиями, написанными выше
13 май 13, 11:47    [14286603]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
iap,
если с условиями if, то почему-то выполняется примерно 3 раза медленнее (ну и текст запроса в 3 раза больше. правда при других количествах строк может и поменяется всё
13 май 13, 12:15    [14286810]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Денис Б.
iap,
если с условиями if, то почему-то выполняется примерно 3 раза медленнее (ну и текст запроса в 3 раза больше. правда при других количествах строк может и поменяется всё
Индекс-то по [Поле] есть?
А то ни о чём разговор получается.

И смотрите реальный план
13 май 13, 12:21    [14286857]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
И, раз речь зашла о процедурах, как я понимаю, то посмотрите parameter sniffing
13 май 13, 12:49    [14287096]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
Денис Б.
Member

Откуда: Екатеринбург
Сообщений: 158
iap,
индекс есть.
на плане выполнения стоимость с IF - 33% а при коротком варианте - все 100%
13 май 13, 13:05    [14287231]     Ответить | Цитировать Сообщить модератору
 Re: Значение числа в степени ноль вдруг не равно единице  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Денис Б.
iap,
индекс есть.
на плане выполнения стоимость с IF - 33% а при коротком варианте - все 100%
Потому что план процедуры строится для значений параметров в момент компиляции.
А во время выполнения с другими параметрами он оказывается, мягко говоря, неоптимальным.
Вот я ссылку на поиск "parameter sniffing" и дал.
13 май 13, 13:09    [14287252]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить