Как сравнить два столбца на равенство в SQL Server? - PullRequest
23 голосов
/ 27 октября 2009

У меня есть два столбца, которые объединены по определенным критериям, но я также хотел бы проверить два, чтобы увидеть, идентичны ли два других столбца, а затем вернуть битовое поле, если они есть.

Есть ли более простое решение, чем использование CASE WHEN?

В идеале я мог бы просто использовать:

    SELECT Column1 = Column2 AS MyDesiredResult
      FROM Table1
INNER JOIN Table2 ON Table1.PrimaryKey = Table2.ForeignKey

Ответы [ 6 ]

51 голосов
/ 27 октября 2009

Что не так с CASE для этого? Чтобы увидеть результат, вам понадобится как минимум байт, и это то, что вы получите с одним символом.

CASE WHEN COLUMN1 = COLUMN2 THEN '1' ELSE '0' END AS MyDesiredResult

должно работать нормально, и для всех намерений и целей выполняет то же самое, что и использование битового поля.

1 голос
/ 13 ноября 2018

СЛУЧАЙ КОГДА - лучший вариант

SELECT 
  CASE WHEN COLUMN1 = COLUMN2 
    THEN '1' 
    ELSE '0' 
  END 
  AS MyDesiredResult
FROM Table1
INNER JOIN Table2 ON Table1.PrimaryKey = Table2.ForeignKey
1 голос
/ 16 июля 2013

Решение, избегающее 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.

1 голос
/ 27 октября 2009

Я бы тоже пошел с CASE WHEN.

В зависимости от того, что вы на самом деле хотите сделать, могут быть и другие варианты, такие как использование внешнего соединения или что-то еще, но в данном случае это не то, что вам нужно.

0 голосов
/ 27 октября 2009

Что касается ответа Дэвида Элизондо, это может дать ложные срабатывания. Он также не дает нулей, если значения не совпадают.

код

DECLARE @t1 TABLE (
    ColID   int     IDENTITY,
    Col2    int
)

DECLARE @t2 TABLE (
    ColID   int     IDENTITY,
    Col2    int
)

INSERT INTO @t1 (Col2) VALUES (123)
INSERT INTO @t1 (Col2) VALUES (234)
INSERT INTO @t1 (Col2) VALUES (456)
INSERT INTO @t1 (Col2) VALUES (1)

INSERT INTO @t2 (Col2) VALUES (123)
INSERT INTO @t2 (Col2) VALUES (345)
INSERT INTO @t2 (Col2) VALUES (456)
INSERT INTO @t2 (Col2) VALUES (2)

SELECT
    t1.Col2 AS t1Col2,
    t2.Col2 AS t2Col2,
    ISNULL(NULLIF(t1.Col2, t2.Col2), 1) AS MyDesiredResult
FROM @t1 AS t1
JOIN @t2 AS t2 ON t1.ColID = t2.ColID

Результаты

     t1Col2      t2Col2 MyDesiredResult
----------- ----------- ---------------
        123         123               1
        234         345             234 <- Not a zero
        456         456               1
          1           2               1 <- Not a match
0 голосов
/ 27 октября 2009

Ближайший подход, о котором я могу подумать, это NULLIF :

SELECT 
    ISNULL(NULLIF(O.ShipName, C.CompanyName), 1),
    O.ShipName,      
    C.CompanyName,
    O.OrderId
FROM [Northwind].[dbo].[Orders] O
INNER JOIN [Northwind].[dbo].[Customers] C
ON C.CustomerId = O.CustomerId

GO

NULLIF возвращает первое выражение , если два выражения не равны . Если выражения равны, NULLIF возвращает нулевое значение типа первого выражения.

Таким образом, запрос выше вернет 1 для записей, в которых эти столбцы равны, первое выражение в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...