首页 新闻 会员 周边

[sql]11111111111110000想确定第五位是不是1

0
悬赏园豆:20 [已解决问题] 解决于 2015-02-02 13:32

11111111111110000想确定第五位是不是1

有什么高效的方法?

zhyinguang的主页 zhyinguang | 初学一级 | 园豆:38
提问于:2015-01-28 15:28
< >
分享
最佳答案
0

SELECT 1 WHERE CHARINDEX('1','11111111111110000',5) = 5

收获园豆:10
Launcher | 高人七级 |园豆:45045 | 2015-01-28 16:14

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

zhyinguang | 园豆:38 (初学一级) | 2015-01-28 17:09

@︶孤独の王者: BinaryToDecimal 最慢,这个好理解,因为它执行的指令相比其它三个方法多多了。

LIKE 慢一点,也可以理解,毕竟有多余的匹配操作。SUBSTRING 同 CHARINDEX 看似相当,但是如果从算法设计上来说,SUBSTRING 会比 CHARINDEX 多一次内存写入。

Launcher | 园豆:45045 (高人七级) | 2015-01-28 17:17
其他回答(3)
0

like '____1*'

或者用截取字符串。

收获园豆:3
幻天芒 | 园豆:37175 (高人七级) | 2015-01-28 15:33

位运算可否?

支持(0) 反对(0) zhyinguang | 园豆:38 (初学一级) | 2015-01-28 15:34

@︶孤独の王者: 更难懂吧。。而且也不会提高什么效率。。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-01-28 15:35

@︶孤独の王者: 位运算你先得把字符串“11111111111110000”转换成整形值。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-01-28 15:47
0

SELECT SUBSTRING('11111111111110000',5,1)

收获园豆:3
问天何必 | 园豆:3311 (老鸟四级) | 2015-01-28 15:35

SELECT CASE SUBSTRING('11111111111110000',5,1) WHEN 1 THEN '是1' END   

支持(0) 反对(0) 问天何必 | 园豆:3311 (老鸟四级) | 2015-01-28 15:39

@问天何必: 

我试试效率。

支持(0) 反对(0) zhyinguang | 园豆:38 (初学一级) | 2015-01-28 15:46

@︶孤独の王者: 不用试了, 效率肯定比like高

支持(0) 反对(0) 问天何必 | 园豆:3311 (老鸟四级) | 2015-01-28 15:48

@︶孤独の王者: 

自己看, cpu、持续时间等。  你有两个选择, 一是用substring, 二是用charindex。 

这个图是多年前在2005上的、 字段上有聚集索引。 

其实,c和s的查询速度都一样, 只是在不同索引的情况下, 持续时间不同罢了。 

你可以想怎么写就怎么写。 看你的喜好。

支持(0) 反对(0) 问天何必 | 园豆:3311 (老鸟四级) | 2015-01-28 18:29
0

试试按位与(bitwise and)操作:

SELECT 1
WHERE 0x11111111111110000 & CONVERT(INT,0x10000) = CONVERT(INT,0x10000)
收获园豆:4
dudu | 园豆:31003 (高人七级) | 2015-01-28 15:57

 我这是字符串,如何转化为0x呢?

支持(0) 反对(0) zhyinguang | 园豆:38 (初学一级) | 2015-01-28 16:01

CONVERT(INT,0x10000) 等于 65536

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-01-28 16:01

@Launcher: 汗,这是16进制,不是2进制

支持(0) 反对(0) dudu | 园豆:31003 (高人七级) | 2015-01-28 16:06

@︶孤独の王者: 

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
支持(0) 反对(0) dudu | 园豆:31003 (高人七级) | 2015-01-28 16:16

@dudu: 好的。我试试。

支持(0) 反对(0) zhyinguang | 园豆:38 (初学一级) | 2015-01-28 16:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册