我不是特别擅长处理数据库,但有没有办法将二进制数据表示为一种基本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%
一样简单。或者我做错了吗?
答案 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(或其他任何东西)的身份才能实现最终答案。