SQL Server:从号码中查找成员

时间:2018-11-05 04:45:55

标签: sql-server-2012

问题:如何从给定数字中找出该数字由哪些数字组成?

  

“星期日= 1”,“星期一= 2”,“星期二= 4”,星期三= 8”,“星期四=   16“,”星期五= 32“,”星期六= 64“

例如:给出数字109,则表示星期日,星期二,星期三,星期五,星期六

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作。

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)

答案 1 :(得分:1)

看起来像一个二进制设计。您需要使用按位&运算符来获取所需的输出。

Decimal = Binary

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

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

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

SQL Server内置了bitwise operators。您可以像这样利用按位&

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文档以获取有关按位运算符的更详细说明。