programing

SQL Server에서 동일한 두 열을 비교하려면 어떻게 해야 합니까?

padding 2023. 8. 1. 20:21
반응형

SQL Server에서 동일한 두 열을 비교하려면 어떻게 해야 합니까?

저는 특정 기준으로 함께 연결된 두 개의 열이 있지만, 다른 두 개의 열이 동일한지 확인하고 일치하면 비트 필드를 반환하고 싶습니다.

CASE WHEN을 사용하는 것보다 더 간단한 솔루션이 있습니까?

이상적으로 다음을 사용할 수 있습니다.

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

CASE에 무슨 문제가 있습니까?결과를 보려면 적어도 바이트가 필요합니다. 이것이 단일 문자로 얻을 수 있는 것입니다.

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

잘 작동해야 하며, 모든 면에서 비트 필드를 사용하는 것과 동일한 작업을 수행합니다.

나은 옵션인 경우

SELECT 
  CASE WHEN COLUMN1 = COLUMN2 
    THEN '1' 
    ELSE '0' 
  END 
  AS MyDesiredResult
FROM Table1
INNER JOIN Table2 ON Table1.PrimaryKey = Table2.ForeignKey

IIF의 사용?또한 SQL Server 버전에 따라 다릅니다.

SELECT
IIF(Column1 = Column2, 1, 0) AS MyDesiredResult
FROM Table;

저는 그걸로 하겠습니다.CASE WHEN또한.

여러분이 실제로 무엇을 하고 싶은지에 따라, 외부 결합을 사용하는 것과 같은 다른 옵션이 있을 수 있지만, 이 경우에는 그것이 여러분에게 필요한 것처럼 보이지 않습니다.

David Elizondo의 답변과 관련하여, 이것은 잘못된 긍정을 줄 수 있습니다.또한 값이 일치하지 않는 곳에는 0을 제공하지 않습니다.

코드

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

회피하는 솔루션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.

참고: 또한 SQL Server 2012에는IIF기능.

제가 생각할 수 있는 가장 가까운 접근법은 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는 첫 번째 식 유형의 null 값을 반환합니다.

따라서 위 쿼리는 해당 열이 동일한 레코드에 대해 1을 반환하고 그렇지 않은 경우 첫 번째 식을 반환합니다.

언급URL : https://stackoverflow.com/questions/1632792/how-do-i-compare-two-columns-for-equality-in-sql-server

반응형