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_2512060918110928770 AS CustomerID,
@pMAIN_2512060918110928771 AS Preferences
UNION ALL
SELECT @pMAIN_2512060918110928772 AS CustomerID,
@pMAIN_2512060918110928773 AS Preferences
UNION ALL
SELECT @pMAIN_2512060918110928774 AS CustomerID,
@pMAIN_2512060918110928775 AS Preferences
UNION ALL
SELECT @pMAIN_2512060918110928776 AS CustomerID,
@pMAIN_2512060918110928777 AS Preferences)
SELECT CustomerID,
Preferences,
CASE WHEN Preferences & @pMAIN_2512060918110928778 = @pMAIN_2512060918110928779 THEN @pMAIN_251206091811092877_10 ELSE @pMAIN_251206091811092877_11 END AS PrefersEmail,
CASE WHEN Preferences & @pMAIN_251206091811092877_12 = @pMAIN_251206091811092877_13 THEN @pMAIN_251206091811092877_14 ELSE @pMAIN_251206091811092877_15 END AS PrefersPhone,
CASE WHEN Preferences ^ @pMAIN_251206091811092877_16 = @pMAIN_251206091811092877_17 THEN @pMAIN_251206091811092877_18 WHEN Preferences ^ @pMAIN_251206091811092877_19 = @pMAIN_251206091811092877_20 THEN @pMAIN_251206091811092877_21 WHEN Preferences ^ @pMAIN_251206091811092877_22 = @pMAIN_251206091811092877_23 THEN @pMAIN_251206091811092877_24 ELSE @pMAIN_251206091811092877_25 END AS PreferenceCategory
FROM CustomerPreferences;
Parameters (If used)
| Name | Value |
|---|---|
| @pMAIN_2512060918110928770 | 1 |
| @pMAIN_2512060918110928771 | 1 |
| @pMAIN_2512060918110928772 | 2 |
| @pMAIN_2512060918110928773 | 2 |
| @pMAIN_2512060918110928774 | 3 |
| @pMAIN_2512060918110928775 | 3 |
| @pMAIN_2512060918110928776 | 4 |
| @pMAIN_2512060918110928777 | 0 |
| @pMAIN_2512060918110928778 | 1 |
| @pMAIN_2512060918110928779 | 1 |
| @pMAIN_251206091811092877_10 | Prefers Email |
| @pMAIN_251206091811092877_11 | Does not prefer Email |
| @pMAIN_251206091811092877_12 | 2 |
| @pMAIN_251206091811092877_13 | 2 |
| @pMAIN_251206091811092877_14 | Prefers Phone |
| @pMAIN_251206091811092877_15 | Does not prefer Phone |
| @pMAIN_251206091811092877_16 | 3 |
| @pMAIN_251206091811092877_17 | 0 |
| @pMAIN_251206091811092877_18 | Prefers Both |
| @pMAIN_251206091811092877_19 | 1 |
| @pMAIN_251206091811092877_20 | 0 |
| @pMAIN_251206091811092877_21 | Prefers Only Email |
| @pMAIN_251206091811092877_22 | 2 |
| @pMAIN_251206091811092877_23 | 0 |
| @pMAIN_251206091811092877_24 | Prefers Only Phone |
| @pMAIN_251206091811092877_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 |