두 필드가 동일한 경우 CASE 문으로 알고 싶습니다.
다음 쿼리로 수행했지만 더 나은 접근 방법이 있는지 궁금합니다. 나는 '='가 대소 문자 구분 비교를 원합니다. COLLATE로 시도했지만 결과를 필터링하는 WHERE 절을 사용해야합니다. 모든 행을 원합니다. 그리고 HASHBYTES를 사용하면 특히 ISNULL과 결합해야 할 때 과도하게 보입니다.
DECLARE @myTable AS TABLE (old varchar(255), new varchar(255));
INSERT INTO @myTable VALUES
('test', 'test'),
('test', 'TEST'),
(null, null)
SELECT old, new,
CASE WHEN HASHBYTES('SHA2_512', old) = HASHBYTES('SHA2_512', new) THEN 'same' ELSE 'changed' END AS updated,
CASE WHEN HASHBYTES('SHA2_512', ISNULL(old, '')) = HASHBYTES('SHA2_512', ISNULL(new, '')) THEN 'same' ELSE 'changed' END AS updated_isnull
FROM @myTable
--where old = new COLLATE Latin1_General_CS_AS
'updated_isnull'열이 필요합니다.
| old | new | updated | updated_isnull |
| ---- | ---- | ------- | -------------- |
| test | test | same | same |
| test | TEST | changed | changed |
| NULL | NULL | changed | same |
적절한 해결책은 데이터가 대소 문자를 구분하는 데이터 정렬에 저장되도록 열을 수정하는 것입니다. 그런 다음 다음을 수행합니다.
select old, new,
case when old = new
or (old is null and new is null)
then 1
else 0
end as is_same
from @mytable
대소 문자를 구분하지 않는 데이터 정렬을 사용하면 다음과 같이 해결할 수 있습니다.
select old, new,
case when old collate Latin1_General_Bin = new collate Latin1_General_Bin
or (old is null and new is null)
then 1
else 0
end as is_same
from @mytable
이전 | 새로운 | is_same : --- | : --- | ------ : 테스트 | 테스트 | 테스트 1 개 | 테스트 | 0 null | null | 1
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다