Решение, избегающее CASE WHEN
, заключается в использовании COALESCE
.
SELECT
t1.Col2 AS t1Col2,
t2.Col2 AS t2Col2,
COALESCE(NULLIF(t1.Col2, t2.Col2),NULLIF(t2.Col2, t1.Col2)) as NULL_IF_SAME
FROM @t1 AS t1
JOIN @t2 AS t2 ON t1.ColID = t2.ColID
Столбец
NULL_IF_SAME
даст NULL
для всех строк, где t1.col2 = t2.col2
(включая NULL
).
Хотя это не более читаемо, чем выражение CASE WHEN
, это ANSI SQL.
Просто для удовольствия, если кто-то хочет иметь логические значения битов 0 и 1 (хотя он не очень читабелен, поэтому не рекомендуется), можно использовать (который работает для всех типов данных):
1/ISNULL(LEN(COALESCE(NULLIF(t1.Col2, t2.Col2),NULLIF(t2.Col2, t1.Col2)))+2,1) as BOOL_BIT_SAME.
Теперь, если у вас один из числовых типов данных и вы хотите получить биты, в приведенной выше функции LEN
сначала преобразуется в строку, что может быть проблематично, поэтому вместо этого это должно работать:
1/(CAST(ISNULL(ABS(COALESCE(NULLIF(t1.Col2, t2.Col2),NULLIF(t2.Col2, t1.Col2)))+1,0)as bit)+1) as FAST_BOOL_BIT_SAME_NUMERIC
Выше будет работать для целых чисел без CAST
.
ПРИМЕЧАНИЕ: также в SQLServer 2012 у нас есть функция IIF
.