在tsql中将base 16字符串转换为base 2字符串

时间:2017-11-20 16:30:20

标签: sql tsql binary type-conversion hex

我不是特别擅长处理数据库,但有没有办法将二进制数据表示为一种基本2字符串?我使用TSQL。无论我做什么,我都会将二进制值表示为最多16个字符串。例如,我在单元格中有500,我希望它显示/处理为'0b111110100'而不是'0x01F4'。此

 CONVERT(VARCHAR, cast(500 as binary(2)), 1)

给出0x01F4,而我想得到111110100或类似内容。

我没有找到任何合适的内置函数。但是,我遇到了一个可怕的,非常复杂的过程,将16个基本字符串转换为2个字符串。此外,我可以考虑对值使用嵌套replace()调用来将F替换为1111等,但感觉不对。

完整的目的是找到二进制表示中连续至少4 1 s的值。我的方法:如果我能让它们看起来像'0b111110100'那么它就像LIKE %1111%一样简单。或者我做错了吗?

1 个答案:

答案 0 :(得分:0)

牢记我的最初目标:

  

目的是找到二进制表示中连续至少4个1的值。

我采用了另一种方法(没有建议的功能)并且可以提出这个解决方案 - 首先,我通过Common Table Expressions使用递归来获得所需值的二进制表示,如下所示:

with cte as(
    select 1 code, 29/2 n, 29 - 2*(29/2) bit_val
    union all
    select code, n/2, n - 2*(n/2) from cte
    where n > 0
)
select  code, row_number() over(partition by code order by n desc) 
bit_no, bit_val from cte

给了我二进制表示29(例如):

-- code is an id of entity where the value I am trying to convert into binary belongs to
---------------------------
| code | bit_no | bit_val |
---------------------------
|  12  |   1    |    1    |
|  12  |   2    |    0    | 
|  12  |   3    |    1    |
|  12  |   4    |    1    |
|  12  |   5    |    1    |
---------------------------

然后我在4行窗口中使用了聚合函数(SUM):

select *, sum(bit_val) over(partition by code order by bit_no 
rows between current row and 3 following) bits_in_a_row from cte1

-------------------------------------------
| code | bit_no | bit_val | bits_in_a_row |
-------------------------------------------
|  12  |   1    |    1    |       3       |
|  12  |   2    |    0    |       3       | 
|  12  |   3    |    1    |       3       |
|  12  |   4    |    1    |       2       |
|  12  |   5    |    1    |       1       |
-------------------------------------------

如果4个连续行中的单元格总和为4 - 我得到的是我正在寻找的内容,尽管它不是基本16个字符串到基本2个字符串的转换,因为我最初把它放在标题中。只有bits_in_a_row等于4(或其他任何东西)的身份才能实现最终答案。