У меня есть тип столбца INT, я хочу выбрать 1, если он содержит 1 и 0 в противном случае. Я знаю только способ сделать это, используя CASE:
CASE WHEN val=1 THEN 1 ELSE 0
Какие еще существуют подходы к достижению одного и того же результата?
У меня есть тип столбца INT, я хочу выбрать 1, если он содержит 1 и 0 в противном случае. Я знаю только способ сделать это, используя CASE:
CASE WHEN val=1 THEN 1 ELSE 0
Какие еще существуют подходы к достижению одного и того же результата?
SQL SERVER 2012:
SELECT CAST(IIF ( field = 1, 1, 0 ) AS BIT) FROM table
В противном случае:
SELECT CAST(CASE field WHEN 1 THEN 1 ELSE 0 END AS BIT) From table
Преобразование простое, если оно равно 1 или 0, вы можете просто назначить его, не нужно что-то делать
вы делаете то же самое, когда вы объявляете переменную правильно?
@declare @myBit bit =1;
однако, если вы хотите сделать что-то более полезное с целым числом, например, сравнение с растровым изображением, становится более интересным. вы можете сравнить два целых числа и вернуть бит в зависимости от способа определения.
Позвольте мне попробовать и визуализировать
00000001=1
00000010=2
00000011=3
==============
FFFFFFTT
поэтому, если у вас есть значение 1, значение True,
На самом деле это сопоставление битмапов с 2 значениями, как отображение растра, вы можете иметь несколько или даже группировать их, используя 0 + 1 на уровне байта.
Выше видно, что "1" находится в "3", а "2" находится в "3
посмотрите пример TSQL unit test ниже
declare @notSet int =0
, @CanView int =1
, @CanEdit int =2
, @CanSubmit int =4
, @CanApprove int =8
, @CanDelete int =16;
declare @contributor int = @CanView | @CanEdit | @CanSubmit --> Can't delete
, @moderator int = @CanView | @CanEdit | @CanDelete --> not allowed to sumbit
, @admin int = @CanView | @CanEdit | @CanSubmit | @CanApprove | @CanDelete;--> can do all
SELECT TEST='A admin can Submit' , RESULT= iif(@admin & @CanSubmit = @CanSubmit,'TRUE','FALSE')
UNION ALL
SELECT TEST='A Moderator may not Submit' , RESULT= iif(@moderator & @CanSubmit = @CanSubmit,'FALSE','TRUE')
UNION ALL
SELECT TEST='A Contributer may not delete' , RESULT= iif(@contributor & @CanDelete = @CanDelete,'FALSE','TRUE')
UNION ALL
SELECT TEST='A Moderator may delete' , RESULT= iif(@moderator & @CanDelete = @CanDelete,'TRUE','FALSE')
Вы можете комбинировать значения вместе с помощью оператора бит | например 1 | 2 = 3 и 1 | 1 = 1, не смешивайте "|" с "+" здесь, поскольку он не всегда будет хорошо работать; -)
Например, ошибкой будет @CanView + @CanView будет @CanEdit,
когда вы ожидаете @CanView | @canView по-прежнему будет @canView
Попробуйте в SQL
SELECT (1|1), (1+1)
Ниже некоторых С#, Надеюсь, это поможет тем, кто любит сохранять и работать с перечислениями в коде и базе данных.
Скажем, у вас есть Enum и класс вроде этого: [Flags] public enum Права { notSet = 0 , CanView = 1 , CanEdit = 2 , CanSubmit = 4 , CanApprove = 8 , CanDelete = 16 }
public class User
{
public Rights Permission {get;set}
}
...
// user can change his own posts
var user = new User();
user.Permission = Rights.CanView | Rights.CanEdit | Rights.CanDelete ;
Теперь вы можете сохранить разрешение в базе данных и прочитать значение, используя один из приведенных ниже методов, где вы сравниваете один или сравниваете несколько
var result = user.Permission & Rights.CanView == Rights.CanView;
var canChange = ((user.Permission & (Rights.CanView | Rights.CanEdit | Rights.CanDelete)) != 0);
Итак, Round Tripped в базу данных и обратно, надеюсь, что у вас есть то, что вы ищете
Счастливое кодирование,
Вальтер
Вот еще одно решение. Без case
или iif
:
select ~cast(sign(abs(@i - 1)) as bit)
Но это не работает, если @i = -2147483648. Затем вы должны преобразовать его в bigint
.
Все, что вам нужно сделать, это отбросить/преобразовать int
в bit
.
DECLARE
@val INT = 42;
,@bitVal BIT;
SET @bitVal = CAST(@val AS BIT); -- equals 1
Любое ненулевое число будет преобразовано в значение true.
https://technet.microsoft.com/en-us/library/ms191530(v=sql.105).aspx#_bit