2015-10-28 6 views
0

У меня есть FIREBIRD таблицы базы данных со столбцом типа VARCHAR, состоящим из шестнадцатеричного числа:Преобразование шестнадцатеричных VARCHAR в двоичный VARCHAR

MyColumn
2020FF
731DD1
...

Я хочу выбрать все строки таблицы, где столбец, преобразованный из шестнадцатеричного в двоичный, содержит значение 1 в 7-м бите (или 8-м или 9-м или любом другом) с одним единственным оператором SQL.

Пример:

2020ff -> 001000000010000011111111 -> ЛОЖЬ
731DD1 -> 011100110001110111010001 -> ИСТИНА

Псевдокод:

SELECT MyColumn FROM MyTable WHERE SUBSTRING(hexToBinary(MyColumn),7,7)=1 
+1

В Firebird нет стандартной функциональности, которая позволила бы вам это сделать, вам нужно будет написать свой собственный UDF; или найти существующий UDF, который делает это. –

ответ

2

Если число в столбце VarChar достаточно мал, что помещается в 64-битное целое число, которое вы могли бы наложить на bigint, а затем использовать функцию встроенной функции bin_and(), чтобы проверить состояние бит (ов). Т.е. проверить 7-й бит:

SELECT MyColumn FROM myTable WHERE bin_and(cast('0x' || MyColumn as bigint), 64) <> 0;