Оператор SQL для SQL Server, который выбирает записи из столбца, который содержит сумму значений мощности 2 - PullRequest
2 голосов
/ 18 октября 2019

Я хочу написать оператор SQL для SQL Server, который выбирает записи из столбца, который содержит значение суммы мощности 2 (2 ^ n), например, у меня есть TABLE xxx:

_________________________________________________________
| id | col_pow |col_pow=sum of element power of 2 (2^n) |
|----|---------|----------------------------------------|
| 1  | 11      |11  = 8+2+1   = 2^3 + 2^1 +2^0          |           
| 2  | 3       |3   = 2+1     = 2^1 + 2^0               |
| 3  | 514     |514 = 512+2   = 2^9 + 2^1               |
| 4  | 49      |49  = 32+16+1 = 2^5 + 2^4 +2^0          |
| 5  | 7       |7   = 4+2+1   = 2^2 + 2^1 +2^0          |
---------------------------------------------------------

EX. SELECT

1) SELECT id TABLE xxx WHERE col_pow can_contains 4 (=2^2)

  • ожидаемый результат:
| id |
|----|
| 5  |

2) SELECT id TABLE xxx WHERE col_pow can_contains 2 (=2^1)

  • ожидаемый результат:
| id |
|----|
| 1  |
| 2  |
| 3  |
| 5  |

3) SELECT id TABLE xxx WHERE col_pow can_contains 512(=2^9)

  • ожидаемый результат:
| id |
|----|
| 3  |

Как написать 3 оператора

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Вы также можете использовать целочисленную арифметику

declare @p int = 1;

select *
from (
    values
     (1, 11  , '= 8+2+1   = 2^3 + 2^1 +2^0')
    ,(2, 3   , '= 2+1     = 2^1 + 2^0     ')
    ,(3, 514 , '= 512+2   = 2^9 + 2^1     ')
    ,(4, 49  , '= 32+16+1 = 2^5 + 2^4 +2^0')
    ,(5, 7   , '= 4+2+1   = 2^2 + 2^1 +2^0')   
) t(id, pow, comment)
where pow % power(2, @p+1) >= power(2, @p)
1 голос
/ 18 октября 2019

Если я правильно вас понимаю, здесь может помочь Побитовое И (&) .

Таблица:

CREATE TABLE #Data (
    id int,
    col_pow int
)
INSERT INTO #Data 
    (id, col_pow)
VALUES
    (1, 11),
    (2, 3),
    (3, 514),
    (4, 49),
    (5, 7)

Заявление:

DECLARE @power int = 9
SELECT *
FROM #Data
WHERE (col_pow & POWER(2, @power)) = POWER(2, @power) 

Результат:

id  col_pow
3   514

Расчеты (для 2^9):

-------|----------------|-----
A      | 0010 0000 0010 | 514
B      | 0010 0000 0000 | 512
-------|----------------|-----
A & B  | 0010 0000 0000 | 512
...