SQL Server>>中按位操作的替代方法,列中的位超过62位
我的SQL上有递归脚本,例如:SQL Server>>中按位操作的替代方法,列中的位超过62位,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的SQL上有递归脚本,例如: WITH recursive bits AS ( SELECT 0 AS idx UNION ALL SELECT idx + 1 AS idx FROM bits WHERE bits.idx + 1 < 64) select power(2,idx) , idx from bits WHERE (9223372036854775808 >> bits.idx
WITH recursive bits AS (
SELECT 0 AS idx
UNION ALL
SELECT idx + 1 AS idx
FROM bits
WHERE bits.idx + 1 < 64)
select power(2,idx) , idx
from bits
WHERE (9223372036854775808 >> bits.idx & 1) = 1
但现在我需要将其转换为SQL Server
我知道功能的力量
WITH bits AS (
SELECT 0 AS idx
UNION ALL
SELECT idx + 1 AS idx
FROM bits
WHERE bits.idx + 1 < 63
)
select *
from bits
where floor(4611686018427387904/power( cast(2 as bigint) ,idx)) & 1 = 1
但是我需要将power2,idx转换为powercast2作为float,idx,其中power>2,62,在这个操作符之后&不起作用。因为它只处理int类型。经过一段时间的尝试,找到了任何决定。 最终版本-我们将在这一行中使用varbinary20 对it主题非常有帮助: 函数[DobitMatchFromBinary] 但在那个版本中,我们有一条从左到右的线。我有不同的位线: 预信息: 大端
1 byte 7|6|5|4|3|2|1|0
2 byte 15|14|13|12|11|10|9|8
3 byte 23|22|21|20|19|18|17|16
..
还是小恩迪亚
3 byte 23|22|21|20|19|18|17|16
2 byte 15|14|13|12|11|10|9|8
1 byte 7|6|5|4|3|2|1|0
..
CREATE FUNCTION [dbo].[DoBitsMatchFromBinaryFromBytes](@bitToCheck INT,@inputBinary VARBINARY(1024))
RETURNS BIT
AS
BEGIN
DECLARE @byte int = (@bitToCheck) / 8
DECLARE @bit int = @bitToCheck - @byte * 8
DECLARE @bytemask int = POWER(2, 8-@bit)
SET @byte = @byte + 1
RETURN floor(CONVERT(int, SUBSTRING(@inputBinary, @byte, 1), 2)/power( cast(2 as bigint),@bit)) & 1
END
示例MySQL:
WITH RECURSIVE bits AS (
SELECT 0 AS idx
UNION ALL
SELECT idx + 1 AS idx
FROM bits
WHERE bits.idx + 1 < 160)
SELECT *
FROM bits
WHERE (4611686018968453378 >> bits.idx & 1) = 1;
它帮助我从big endian varbinary返回正确的位数:
示例MSSQL:
WITH bits AS (
SELECT 0 AS idx
UNION ALL
SELECT idx + 1 AS idx
FROM bits
WHERE bits.idx + 1 < 160)
SELECT *
FROM bits
WHERE [dbo].[DoBitsMatchFromBinaryFromBytes](bits.idx,0x0201402000000040) = 1
OPTION(MAXRECURSION 160);
如果有人能改进这个版本,那就太好了。
我希望它也能有所帮助。按位操作并不适合SQL的优点。单独的事实应存储为单独的数据块,而不是全部塞进一个对系统完全不透明、无法索引的值中。这是否回答了您的问题@Damien_The_异教者改变存储信息的类型是一个好主意,但我有我所拥有的,我只需要将sql系统从我的sql更改为ms sql。您需要的范围是什么,即多少位?如果它超过64位BigInt,那么您将使用什么数据类型,因为SQL Server不能将其表示为数字数据类型?我需要使用最多160位的行