2011-03-31 78 views
1

說我有以下幾點:SQL服務器位邏輯操作 - 需要一些幫助

Declare @LineA int 
Declare @LineB int 
Declare @LineC int 
Declare @LineD int 
Declare @LineRequested int 
Declare @LineTaken int 

Set @LineA = 1 
Set @LineB = 2 
Set @LineC = 4 
Set @LineD = 8 

Set @LineRequested = 11 -- @LineA | @LineB | @LineD 

Set @LineTaken = 2 -- Matches a line in @LineRequested (@LineB) 
Set @LineTaken = 4 -- Does not match (Line C was not one of the lines OR'd) 

如何測試,看看是否在@LineTaken值彌補了@LineRequested值的ONE?在上面的例子中,當@LineTaken = 2時,它匹配其中一個值(@LineA | @LineB)。但是,第二,它不。我如何以編程方式確定這一點?

+0

是'@ LineTaken'總是2的冪?你一直在尋找一條線嗎?如果不是'@ LineTaken'例如是5時會發生什麼?如果** 1和4匹配或兩者匹配,你會想匹配嗎? – 2011-03-31 12:24:04

回答

2
SELECT CASE WHEN @LineRequested | 2 = @LineRequested THEN 'Y' ELSE 'N' END, 
     CASE WHEN @LineRequested | 4 = @LineRequested THEN 'Y' ELSE 'N' END 
+0

@Dumitrescu,不要爲此而出汗。它會欺騙我。我只是因爲你的評論而變得更近了。 * + 1兩個解決方案順便說一句,afaik,他們都似乎對我來說正確* – 2011-03-31 12:29:39

+0

完美,謝謝。 – 2011-03-31 12:31:55

+0

@Lieven - 如果'@ LineTaken'不是2的精確冪,它們就不同了。只有在@ @ LineTaken中設置的所有位也設置在'@ LineRequested'時,我的回答纔會返回'Y'。杜米特雷斯庫的答案是否至少有一位匹配。這可能是從文本中的粗體**一個**所要求的,但是給出的示例沒有澄清這一點... – 2011-03-31 12:35:09

2

嘗試:

SELECT CASE WHEN @LineRequested & @LineTaken > 0 THEN 'Y' ELSE 'N' END