Bitwise XOR operator


SQL Server Query

            
-- Simplified example to demonstrate XOR  
WITH CustomerPreferences AS (
SELECT 1 AS CustomerID, 1 AS Preferences UNION ALL -- Only Email
SELECT 2, 2 UNION ALL -- Only Phone
SELECT 3, 3 UNION ALL -- Both
SELECT 4, 0 -- Neither
)
SELECT
CustomerID,
Preferences,
CASE
WHEN (Preferences & 1) = 1 THEN 'Prefers Email'
ELSE 'Does not prefer Email'
END AS PrefersEmail,
CASE
WHEN (Preferences & 2) = 2 THEN 'Prefers Phone'
ELSE 'Does not prefer Phone'
END AS PrefersPhone,
CASE
WHEN (Preferences ^ 3) = 0 THEN 'Prefers Both'
WHEN (Preferences ^ 1) = 0 THEN 'Prefers Only Email'
WHEN (Preferences ^ 2) = 0 THEN 'Prefers Only Phone'
ELSE 'Prefers Neither or Mixed'
END AS PreferenceCategory
FROM CustomerPreferences;

Create SQL query with SqlQueryBuilder

            
var (sql, parameters) = new SqlQueryBuilder()  
.WithCTETable(new Table("CustomerPreferences"), new SqlQueryBuilder()
.Select()
.Column(1, "CustomerID").Column(1, "Preferences")
.UnionAll(new SqlQueryBuilder()
.Select()
.Column(2, "CustomerID").Column(2, "Preferences")
.UnionAll(new SqlQueryBuilder()
.Select()
.Column(3, "CustomerID").Column(3, "Preferences")
.UnionAll(new SqlQueryBuilder()
.Select()
.Column(4, "CustomerID").Column(0, "Preferences")
)
)
)
)
.Select()
.Columns("CustomerID","Preferences")
.Column(new CASE().When(new ColumnArithmatic("Preferences").BitwiseAND(1).Equale(1))
.Then("Prefers Email").Else("Does not prefer Email"), "PrefersEmail")
.Column(new CASE().When(new ColumnArithmatic("Preferences").BitwiseAND(2).Equale(2))
.Then("Prefers Phone").Else("Does not prefer Phone"), "PrefersPhone")
.Column(new CASE()
.When(new ColumnArithmatic("Preferences").BitwiseXOR(3).Equale(0)).Then("Prefers Both")
.When(new ColumnArithmatic("Preferences").BitwiseXOR(1).Equale(0)).Then("Prefers Only Email")
.When(new ColumnArithmatic("Preferences").BitwiseXOR(2).Equale(0)).Then("Prefers Only Phone")
.Else("Prefers Neither or Mixed")
, "PreferenceCategory")
.From("CustomerPreferences")
.Build();

Query build by SqlQueryBuilder

            
WITH CustomerPreferences
AS (SELECT @pMAIN_2507200126441011620 AS CustomerID,
           @pMAIN_2507200126441011621 AS Preferences
    UNION ALL
    SELECT @pMAIN_2507200126441011622 AS CustomerID,
           @pMAIN_2507200126441011623 AS Preferences
    UNION ALL
    SELECT @pMAIN_2507200126441011624 AS CustomerID,
           @pMAIN_2507200126441011625 AS Preferences
    UNION ALL
    SELECT @pMAIN_2507200126441011626 AS CustomerID,
           @pMAIN_2507200126441011627 AS Preferences)
SELECT CustomerID,
       Preferences,
       CASE WHEN Preferences & @pMAIN_2507200126441011628 = @pMAIN_2507200126441011629 THEN @pMAIN_250720012644101162_10 ELSE @pMAIN_250720012644101162_11 END AS PrefersEmail,
       CASE WHEN Preferences & @pMAIN_250720012644101162_12 = @pMAIN_250720012644101162_13 THEN @pMAIN_250720012644101162_14 ELSE @pMAIN_250720012644101162_15 END AS PrefersPhone,
       CASE WHEN Preferences ^ @pMAIN_250720012644101162_16 = @pMAIN_250720012644101162_17 THEN @pMAIN_250720012644101162_18 WHEN Preferences ^ @pMAIN_250720012644101162_19 = @pMAIN_250720012644101162_20 THEN @pMAIN_250720012644101162_21 WHEN Preferences ^ @pMAIN_250720012644101162_22 = @pMAIN_250720012644101162_23 THEN @pMAIN_250720012644101162_24 ELSE @pMAIN_250720012644101162_25 END AS PreferenceCategory
FROM CustomerPreferences;


            
        

Parameters (If used)

Name Value
@pMAIN_2507200126441011620 1
@pMAIN_2507200126441011621 1
@pMAIN_2507200126441011622 2
@pMAIN_2507200126441011623 2
@pMAIN_2507200126441011624 3
@pMAIN_2507200126441011625 3
@pMAIN_2507200126441011626 4
@pMAIN_2507200126441011627 0
@pMAIN_2507200126441011628 1
@pMAIN_2507200126441011629 1
@pMAIN_250720012644101162_10 Prefers Email
@pMAIN_250720012644101162_11 Does not prefer Email
@pMAIN_250720012644101162_12 2
@pMAIN_250720012644101162_13 2
@pMAIN_250720012644101162_14 Prefers Phone
@pMAIN_250720012644101162_15 Does not prefer Phone
@pMAIN_250720012644101162_16 3
@pMAIN_250720012644101162_17 0
@pMAIN_250720012644101162_18 Prefers Both
@pMAIN_250720012644101162_19 1
@pMAIN_250720012644101162_20 0
@pMAIN_250720012644101162_21 Prefers Only Email
@pMAIN_250720012644101162_22 2
@pMAIN_250720012644101162_23 0
@pMAIN_250720012644101162_24 Prefers Only Phone
@pMAIN_250720012644101162_25 Prefers Neither or Mixed

Query Results:

  CustomerID Preferences PrefersEmail PrefersPhone PreferenceCategory
1 1 1 Prefers Email Does not prefer Phone Prefers Only Email
2 2 2 Does not prefer Email Prefers Phone Prefers Only Phone
3 3 3 Prefers Email Prefers Phone Prefers Both
4 4 0 Does not prefer Email Does not prefer Phone Prefers Neither or Mixed