Я сохраняю числовое представление двоичных данных в таблице BigQuery

Мне нужно иметь возможность искать по BitPos и ​​узнавать, находится ли бит в данной позиции в 0 или 1

Аналог Oracle - BitTest

Use this function to return TRUE (1) if the specified bit in a value is a 1; otherwise return FALSE (0). Syntax BitTest(Value1, BitPos)

Пример: номер в БД 1099511627780

Так что это двоичный файл 10000000000000000000000000000000000000100

Таким образом, результаты:

BitTest(1099511627780, 1) = 0;

BitTest(1099511627780, 2) = 0;

BitTest(1099511627780, 3) = 1;

Можете ли вы помочь мне найти нативную реализацию в BigQuery?

Я безуспешно просматривал документ

https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators

1
Lev Savranskiy 2 Янв 2018 в 18:35

1 ответ

Лучший ответ

Вы можете создать временную функцию, которая выполняет это вычисление, используя битовый сдвиг и побитовое и. Вот пример:

CREATE TEMP FUNCTION BitTest(value INT64, bit INT64) AS (
  value >> (bit - 1) & 0x1 = 1
);

SELECT
  value,
  bit,
  BitTest(value, bit) AS result
FROM (
  SELECT 1099511627780 AS value, bit
  FROM UNNEST(GENERATE_ARRAY(1, 42)) AS bit
)
ORDER BY bit;

Функция BitTest проверяет, установлен ли бит в индексе, начинающемся с 1. Предложение FROM в этом примере генерирует битовые индексы от 1 до 42, чтобы продемонстрировать результат.

2
Elliott Brossard 2 Янв 2018 в 15:55