SQL Server: найти членов из числа - PullRequest
0 голосов
/ 05 ноября 2018

Задача: Как узнать по заданному номеру, из каких номеров состоит это число?

"Воскресенье = 1", "Понедельник = 2", "Вторник = 4", среда = 8 "," Четверг = 16 "," Пятница = 32 "," Суббота = 64 "

Например: Учитывая число 109, это будет означать воскресенье, вторник, среду, пятницу, субботу

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Похоже на двоичный дизайн. Вам нужно использовать побитовый оператор &, чтобы получить желаемый результат.

Decimal = Binary

109 = 1101101
001 = 0000001
------&------
      0000001 = 1

109 = 1101101
002 = 0000010
------&------
      0000000 = 0

109 = 1101101
004 = 0000100
------&------
      0000100 = 4

В SQL Server встроено битовых операторов . Вы можете использовать побитовые и для этого, как:

DECLARE @InputNum INT = 109

SELECT ISNULL(STUFF(CASE WHEN @InputNum & 1 > 0 THEN ', SUN' ELSE '' END + 
                    CASE WHEN @InputNum & 2 > 0 THEN ', MON' ELSE '' END + 
                    CASE WHEN @InputNum & 4 > 0 THEN ', TUE' ELSE '' END + 
                    CASE WHEN @InputNum & 8 > 0 THEN ', WED' ELSE '' END + 
                    CASE WHEN @InputNum & 16 > 0 THEN ', THU' ELSE '' END + 
                    CASE WHEN @InputNum & 32 > 0 THEN ', FRI' ELSE '' END + 
                    CASE WHEN @InputNum & 64 > 0 THEN ', SAT' ELSE '' END,1,2,''),'')

проверьте документацию MS для более подробного объяснения побитовых операторов.

0 голосов
/ 05 ноября 2018

Вы можете сделать что-то вроде этого.

CREATE FUNCTION dbo.Int2BinaryToWeekDay (@i INT) RETURNS NVARCHAR(2048) AS BEGIN
    RETURN        
        CASE WHEN CONVERT(VARCHAR(16), @i &    64 ) > 0 THEN 'Saturday,' ELSE ''  END +
        CASE WHEN CONVERT(VARCHAR(16), @i &    32 ) > 0 THEN 'Friday,' ELSE '' END +
        CASE WHEN CONVERT(VARCHAR(16), @i &    16 ) > 0 THEN 'Thurday,' ELSE '' END +
        CASE WHEN CONVERT(VARCHAR(16), @i &     8 ) > 0 THEN 'Wed,'  ELSE '' END +
        CASE WHEN CONVERT(VARCHAR(16), @i &     4 ) > 0 THEN 'Tuesday,' ELSE ''  END +
        CASE WHEN CONVERT(VARCHAR(16), @i &     2 ) > 0 THEN 'Monday,' ELSE ''  END +
        CASE WHEN CONVERT(VARCHAR(16), @i &     1 ) > 0 THEN 'Sunday,' ELSE '' END
END;
GO

Теперь сделайте следующее.

 SELECT dbo.Int2BinaryToWeekDay(109)
...