我有一个firebird数据库表,其中包含一个由十六进制数组成的VARCHAR类型的列:
MyColumn
2020FF
731DD1
...
我想选择表的所有行,其中从十六进制转换为二进制的列包含第7位(或第8或第9或任何其他)的值1,只有一个SQL语句。
示例:
2020ff - > 001000000010000011111111 - > FALSE
731DD1 - > 011100110001110111010001 - > TRUE
伪代码:
SELECT MyColumn FROM MyTable WHERE SUBSTRING(hexToBinary(MyColumn),7,7)=1
答案 0 :(得分:2)
如果varchar列中的数字足够小以至于它适合64位整数,则可以将其转换为bigint
,然后使用bin_and()内置函数来检查位的状态。即检查第7位:
SELECT MyColumn FROM myTable WHERE bin_and(cast('0x' || MyColumn as bigint), 64) <> 0;