有没有什么好的方法可以将二进制(基数2)字符串转换为T-SQL中的整数(如果不是,我想我可以写一个函数......)
'0110'=> 6等。
答案 0 :(得分:1)
你知道字符串总是特定的长度吗?如果是这样,你可以硬编码一堆子串/转换为int / multiply步骤。虽然不是很好......
编辑:为了提供更多细节,假设你知道它的长度为4,你可以这样做:
SELECT (8 * CONVERT(int, SUBSTRING(@x, 1, 1)))
+ (4 * CONVERT(int, SUBSTRING(@x, 2, 1)))
+ (2 * CONVERT(int, SUBSTRING(@x, 3, 1)))
+ (1 * CONVERT(int, SUBSTRING(@x, 4, 1)))
如果语法略有偏离,请道歉。
令人不快,并且在更一般的情况下(你基本上需要以某种形式循环)不起作用,但它可能足以快速修复。
(如果downvoters可以请添加评论,我会非常感激.T-SQL有点超出我的专业领域 - 解释为什么这是一个坏主意比仅仅表达它 是一个坏主意。)
答案 1 :(得分:1)
看起来this function可以满足您的需求。 此外,这里看起来有an optimisation。
我不知道任何可以在select语句中工作的内置函数,转换为二进制或varbinary没有帮助。
看起来你不会把它写成UDF或扩展存储过程(托管或本机)。
另一种选择可能是创建一个巨大的查找表并加入其中。你可能会获得比Sql函数更好的性能,我还没有测试过。我怀疑它会比扩展存储过程更好。
答案 2 :(得分:1)
编辑:重新读取sambo99的答案并注意到那里提到的优化版本链接。在回答之前我错过了。它看起来有点相似,但是这个有点高达63位,其中所引用的链接仅适用于最多31位,如果你试图传递更多,它将会爆炸。此版本忽略高于63的任何内容。
DECLARE @bin varchar(63)
DECLARE @origlen int
DECLARE @currlen int
DECLARE @tmp int
DECLARE @pwr bigint
DECLARE @dec bigint
DECLARE @val bigint
SET @pwr = 2
SET @dec = 0
SET @bin = '011111111111111111111111111111111' --Test Value
SET @bin = REVERSE(@bin)
SET @origlen = LEN(@bin)
SET @currlen = 0
WHILE(@currlen <> @origlen)
BEGIN
SET @tmp = CONVERT(int, SUBSTRING(@bin, @currlen + 1, 1))
IF (@tmp <> 0)
BEGIN
SET @val = @dec
SET @dec = POWER(@pwr, @currlen)
SET @val = @val + @dec
Set @dec = @val
END
SET @currlen = @currlen + 1
END
SELECT @val as 'Result'
希望这有帮助。
答案 3 :(得分:0)
我有一些模糊的HERE(StackOverflow),我在T-SQL中询问自定义的“基本”转换。
看看你得到什么建议会很有趣!