11111111111110000想确定第五位是不是1
有什么高效的方法?
SELECT 1 WHERE CHARINDEX('1','11111111111110000',5) = 5
WHERE config LIKE '_________________1' --10s
WHERE SUBSTRING(config,18,1)=1 --9s
WHERE dbo.BinaryToDecimal(config) & 1 = 1 --41s
WHERE CHARINDEX('1',config,18)=18 --9s
@︶孤独の王者: BinaryToDecimal 最慢,这个好理解,因为它执行的指令相比其它三个方法多多了。
LIKE 慢一点,也可以理解,毕竟有多余的匹配操作。SUBSTRING 同 CHARINDEX 看似相当,但是如果从算法设计上来说,SUBSTRING 会比 CHARINDEX 多一次内存写入。
like '____1*'
或者用截取字符串。
位运算可否?
@︶孤独の王者: 更难懂吧。。而且也不会提高什么效率。。
@︶孤独の王者: 位运算你先得把字符串“11111111111110000”转换成整形值。
SELECT SUBSTRING('11111111111110000',5,1)
SELECT CASE SUBSTRING('11111111111110000',5,1) WHEN 1 THEN '是1' END
@问天何必:
我试试效率。
@︶孤独の王者: 不用试了, 效率肯定比like高
@︶孤独の王者:
自己看, cpu、持续时间等。 你有两个选择, 一是用substring, 二是用charindex。
这个图是多年前在2005上的、 字段上有聚集索引。
其实,c和s的查询速度都一样, 只是在不同索引的情况下, 持续时间不同罢了。
你可以想怎么写就怎么写。 看你的喜好。
试试按位与(bitwise and)操作:
SELECT 1 WHERE 0x11111111111110000 & CONVERT(INT,0x10000) = CONVERT(INT,0x10000)
我这是字符串,如何转化为0x呢?
CONVERT(INT,0x10000) 等于 65536
@Launcher: 汗,这是16进制,不是2进制
@︶孤独の王者:
1)将表示二进制数字符串转换成整数(来源):
CREATE FUNCTION [dbo].[BinaryToDecimal] ( @Input varchar(255) ) RETURNS bigint AS BEGIN DECLARE @Cnt tinyint = 1 DECLARE @Len tinyint = LEN(@Input) DECLARE @Output bigint = CAST(SUBSTRING(@Input, @Len, 1) AS bigint) WHILE(@Cnt < @Len) BEGIN SET @Output = @Output + POWER(CAST(SUBSTRING(@Input, @Len - @Cnt, 1) * 2 AS bigint), @Cnt) SET @Cnt = @Cnt + 1 END RETURN @Output END
SELECT dbo.BinaryToDecimal('11111111111110000')
结果是131056
2)将得到的整数与整数16(二进制10000)进行按位与
SELECT 1 WHERE 131056 & 16 = 16
@dudu: 好的。我试试。