Как посмотреть, находится ли вложенное значение в маскированном значении - PullRequest
0 голосов
/ 19 января 2019

Я наткнулся на некоторый код, который хранит несколько значений флажков в 1 значении в базе данных.

Это работает, присваивая каждому значению базовое значение 2 ^ n, добавляя все выбранные значения и сохраняя этот результат.

Мне интересно, как запросить записи в базе данных, которые имеют определенное значение внутри значения, которое хранится в БД.

Пример

Checkbox 1 = 2
Checkbox 2 = 4
Checkbox 3 = 8
Checkbox 4 = 16

Позвольте сказатьфлажки 1 и 3 выбраны.Мы будем хранить 10 в базе данных.

Как мне запросить записи, у которых флажок 1 (значение 2) выбран в результирующем значении, которое хранится в базе данных (10)?

Thisтакое сервер sql.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вы можете использовать побитовую операцию, которая &

давайте возьмем 12 в качестве примера. Побитовый эквивалент 12 равен 1100. если вы хотите узнать, установлен ли флажок 3, необходимо сравнить его с 8 (эквивалент 1000)

1100
1000
-----
1000 => 8

Итак, ваш последний запрос будет

SELECT * from Table1 WHERE answer & 8 = 8
0 голосов
/ 19 января 2019

Вы можете использовать поразрядно AND:

SELECT *
FROM tab
WHERE answer & 10 = 10

Аналогичный подход, используемый на @@ OPTIONS :

Функция @@ OPTIONS возвращает растровое изображение параметров, преобразованное в целое число 10 (десятичное).

Чтобы декодировать значение @@ OPTIONS , преобразуйте целое число, возвращаемое @@ OPTIONS , в двоичный файл, а затем найдите значения в таблице в разделе Настройка параметров пользователя Настройка сервера Вариант. Например, если SELECT @@ OPTIONS; возвращает значение 5496, используйте калькулятор программиста Windows (calc.exe) для преобразования десятичного числа 5496 в двоичное. Результат - 1010101111000. Самые правые символы (двоичные 1, 2 и 4) равны 0, что указывает на то, что первые три элемента в таблице выключены.

Проверка ANSI_NULLS

Чтобы просмотреть текущий параметр для этого параметра, выполните следующий запрос:

DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';  
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';  
SELECT @ANSI_NULLS AS ANSI_NULLS; 
...