【发布时间】:2015-01-02 07:01:00
【问题描述】:
我已经广泛搜索了相关答案,但没有一个完全满足我需要做的事情。
出于我们的目的,我有一列包含 50 个字符的二进制字符串。在我们的数据库中,它实际上有数百个字符长。
我们数据库中的每个唯一项目 ID 都有一个字符串。每个“1”的位置标记一个特定的标准为真,一个“0”为假,因此 1 和 0 的索引位置非常重要。大多数情况下,我关心 1 的位置。
我没有更新任何数据库,所以我首先决定尝试创建一个循环来查看每个字符串并创建 1 的位置列表。
declare @binarystring varchar(50) = '10000010000110000001000000000000000000000000000001'
declare @position int = 0
declare @list varchar(200) = ''
while (@position <= len(@binarystring))
begin
set @position = charindex('1', @binarystring, @position)
set @list = @list + ', ' + convert(varchar(10),@position)
set @position = charindex('1', @binarystring, @position)+1
end
select right(@list, len(@list)-2)
这将创建以下列表:
1, 7, 12, 13, 20, 50
但是,如果字符串末尾没有“1”,则循环将爆炸,因为我是通过出现 1 而不是一次一个字符来搜索字符串。我不确定当循环通常会到达字符串末尾时如何满足中断条件,而没有 1。
我的循环轰炸是否有一个简单的解决方案,我什至应该首先循环吗?
我尝试过其他的解析、联合连接、索引等方法,但鉴于这种非常特殊的情况,我找不到任何可以完全满足我需要的组合。上面的代码是我迄今为止最好的。
我并不特别需要以逗号分隔的列表作为输出,但我需要知道字符串中所有 1 的位置。 1 的数量不同,但字符串大小始终相同。
这是我第一次在 stackoverflow 上发帖,但我已经多次使用答案。我试图用相关信息提出一个明确的问题。如果有什么我能帮忙的,我会尽力满足任何要求。
【问题讨论】:
标签: sql sql-server arrays loops binary