GET BIT: примеры (SQL)

Извлечение битов данных с помощью GET_BIT
Раздел: Битовые функции, Битовые
GET_BIT(expression bit string or integer, position integer): integer

Функция GET_BIT в MS SQL Server

Функция GET_BIT возвращает значение отдельного бита из указанного целочисленного или двоичного выражения. Она полезна для анализа значений на уровне отдельных битов, что находит применение в системах хранения флагов, оптимизации данных, обработке битовых масок или при работе с аппаратными регистрами.

Синтаксис функции:
GET_BIT ( expression, bit_offset )

Аргументы:

  • expression — целочисленное выражение или выражение типа binary/varbinary. Целочисленные типы преобразуются в двоичные для извлечения бита.
  • bit_offset — целое число, определяющее позицию извлекаемого бита. Отсчёт начинается с 0 и ведётся справа (наименее значащий бит, LSB) для целых чисел. Для двоичных данных отсчёт начинается с 0 для первого (левого) байта, при этом биты внутри байта нумеруются, начиная с самого левого (старшего) бита в байте (позиция 7) до младшего (позиция 0).

Возвращаемое значение: Функция возвращает целочисленное значение типа int, которое может быть 0 или 1. Если bit_offset отрицательный или превышает количество битов в expression, функция возвращает 0.

Базовые примеры использования GET_BIT

Работа с целыми числами:

SELECT GET_BIT(10, 0) AS Bit0, GET_BIT(10, 1) AS Bit1, GET_BIT(10, 2) AS Bit2, GET_BIT(10, 3) AS Bit3;
Bit0 Bit1 Bit2 Bit3
1    0    1    0

Работа с двоичными данными:

SELECT GET_BIT(0xA5, 0) AS Bit0_Byte1, GET_BIT(0xA5, 7) AS Bit7_Byte1;
Bit0_Byte1 Bit7_Byte1
1         0

Использование с переменными разных типов:

DECLARE @bin varbinary(1) = 0x8C; DECLARE @num int = 140; SELECT GET_BIT(@bin, 2) AS BitFromBinary, GET_BIT(@num, 2) AS BitFromInt;
BitFromBinary BitFromInt
1             1

Похожие функции в MS SQL

В SQL Server существуют и другие функции для битовых операций:

  • SET_BIT — устанавливает указанный бит в 0 или 1 и возвращает изменённое значение. Предпочтительнее для модификации данных.
  • BIT_COUNT — возвращает количество битов, установленных в 1. Эффективнее для подсчёта единичных битов, чем последовательный вызов GET_BIT в цикле.
  • LEFT_SHIFT, RIGHT_SHIFT — выполняют побитовые сдвиги. Используют, когда требуется арифметическая операция сдвига, а не просто чтение бита.
  • Побитовые операторы (&, |, ^, ~) — подходят для комплексных побитовых вычислений и масок, но для извлечения одного бита GET_BIT читаемее и проще.

Аналоги функции в других СУБД

MySQL: Используют функцию GET_BIT() с похожим синтаксисом, но она доступна только для числовых типов.

SELECT GET_BIT(10, 1);
1

PostgreSQL: Оператор # или функция get_bit() для работы с битовыми строками (bit strings).

SELECT get_bit(B'1010', 3);
1

Oracle: Прямого аналога нет, используют побитовые операции. Например, извлечение бита через BITAND и сдвиг.

SELECT BITAND(10, POWER(2, 1)) / POWER(2, 1) AS Bit FROM dual;
1

SQLite: Отсутствуют встроенные битовые функции. Используют побитовые операторы или создают пользовательские функции.

Типичные ошибки при работе с GET_BIT

Неправильное понимание нумерации битов для двоичных данных:

SELECT GET_BIT(0x01, 0) AS Result; -- Для binary считает с левого бита в первом байте
0

Ожидание ошибки при отрицательном смещении — функция возвращает 0, а не генерирует исключение:

SELECT GET_BIT(255, -5) AS Result;
0

Передача нечислового выражения приводит к ошибке преобразования типов:

SELECT GET_BIT('text', 2);
Ошибка преобразования значения varchar 'text' к типу данных int.

История изменений функции

Функция GET_BIT была добавлена в SQL Server начиная с версии 2022 (16.x) вместе с набором других битовых функций (SET_BIT, BIT_COUNT). В более ранних версиях SQL Server её не существовало, и для извлечения бита использовались пользовательские функции или комбинации побитовых операторов.

Расширенные примеры применения

Анализ байта состояния (status byte) из двоичного поля:

Пример sql
DECLARE @status varbinary(2) = 0xA43C; SELECT GET_BIT(@status, 15) AS ErrorFlag, GET_BIT(@status, 8) AS ReadyFlag;
ErrorFlag ReadyFlag
1         0

Проверка чётности числа через сумму битов (используя BIT_COUNT для эффективности):

Пример sql
SELECT 15 AS Number, CASE WHEN BIT_COUNT(15) % 2 = 0 THEN 'Чётное число единиц' ELSE 'Нечётное' END AS Parity;
Number Parity
15    Нечётное число единиц

Декодирование набора флагов, хранящихся в одном integer столбце:

Пример sql
CREATE TABLE #Flags (ID int, Flags int); INSERT INTO #Flags VALUES (1, 13), (2, 4); SELECT ID, Flags, GET_BIT(Flags, 0) AS Flag0, GET_BIT(Flags, 2) AS Flag2 FROM #Flags;
ID Flags Flag0 Flag2
1  13    1     0
2  4     0     1

Использование в выражении CASE для классификации:

Пример sql
SELECT Flags, CASE WHEN GET_BIT(Flags, 3) = 1 THEN 'Приоритетный' ELSE 'Стандартный' END AS Type FROM #Flags;
Flags Type
13    Приоритетный
4     Стандартный

Постепенное извлечение битов для отладки:

Пример sql
DECLARE @val int = 42; SELECT @val AS Value, GET_BIT(@val, 5) AS Bit5, GET_BIT(@val, 3) AS Bit3, GET_BIT(@val, 1) AS Bit1;
Value Bit5 Bit3 Bit1
42    1    0    1

MS SQL GET_BIT function comments

En
GET BIT Returns the value of a bit at a specified position