【问题标题】:Convert base 16 strings to base 2 strings in tsql在sql中将base 16字符串转换为base 2字符串
【发布时间】:2018-05-03 22:47:14
【问题描述】:

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

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

0x01F4,而我想得到111110100或类似的东西。

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

整个目的是在它们的二进制表示中找到连续至少有 4 个1s 的值。我的方法:如果我可以让它们看起来像'0b111110100',它就像LIKE %1111% 一样简单。还是我做错了?

【问题讨论】:

标签: sql tsql binary type-conversion hex


【解决方案1】:

牢记我最初的目标:

整个目的是在二进制表示中找到连续至少有 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(或其他任何值)的身份。

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2017-06-28
    • 2012-02-14
    相关资源
    最近更新 更多