Решение избежать 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
.
16.07.2013