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
'programing' 카테고리의 다른 글
CSS의 응답 글꼴 크기 (0) | 2023.08.01 |
---|---|
폴더에 있는 모든 파일의 파일 이름에서 특정 문자 바꾸기 또는 삭제 (0) | 2023.08.01 |
E: 패키지 npm을 찾을 수 없습니다. (0) | 2023.08.01 |
Oracle PL/SQL 생성 또는 교체 저장 프로시저에서 예외를 포착하여 반환(또는 인쇄)하는 방법 (0) | 2023.08.01 |
Oracle에서 최대 절전 모드: CLOB 열에 문자열 속성 매핑 (0) | 2023.08.01 |