Подтвердить что ты не робот

Лучший способ конвертировать INT в BIT

У меня есть тип столбца INT, я хочу выбрать 1, если он содержит 1 и 0 в противном случае. Я знаю только способ сделать это, используя CASE:

CASE WHEN val=1 THEN 1 ELSE 0

Какие еще существуют подходы к достижению одного и того же результата?

4b9b3361

Ответ 1

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

Ответ 2

Преобразование простое, если оно равно 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 в базу данных и обратно, надеюсь, что у вас есть то, что вы ищете

Счастливое кодирование,

Вальтер

Ответ 3

Вот еще одно решение. Без case или iif:

select ~cast(sign(abs(@i - 1)) as bit)

Но это не работает, если @i = -2147483648. Затем вы должны преобразовать его в bigint.

Ответ 4

Все, что вам нужно сделать, это отбросить/преобразовать 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