GET BIT: примеры (SQL)
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) из двоичного поля:
DECLARE @status varbinary(2) = 0xA43C; SELECT GET_BIT(@status, 15) AS ErrorFlag, GET_BIT(@status, 8) AS ReadyFlag;ErrorFlag ReadyFlag 1 0
Проверка чётности числа через сумму битов (используя BIT_COUNT для эффективности):
SELECT 15 AS Number, CASE WHEN BIT_COUNT(15) % 2 = 0 THEN 'Чётное число единиц' ELSE 'Нечётное' END AS Parity;Number Parity 15 Нечётное число единиц
Декодирование набора флагов, хранящихся в одном integer столбце:
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 для классификации:
SELECT Flags, CASE WHEN GET_BIT(Flags, 3) = 1 THEN 'Приоритетный' ELSE 'Стандартный' END AS Type FROM #Flags;Flags Type 13 Приоритетный 4 Стандартный
Постепенное извлечение битов для отладки:
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