2016-11-11 3 views
2
감안할 때

Table structure and values이 NULL 빈 값을 모두 포함

지금은 "STRVAL1 및 STRVAL2"다음 "BVAL1 및 BVAL2"를 비교하는 쿼리를 작성해야, 내 테이블 구조 , 둘 다 같지 않으면 그 행이 리턴되어야합니다.

예상 결과 ... NULL의이 성가신 조금하게하지만

enter image description here

는, 데이터

DECLARE @TAB TABLE (ID INT, STRVAL1 VARCHAR(8), STRVAL2 VARCHAR(8), BVAL1 BIT, BVAL2 BIT) 

    INSERT INTO @TAB VALUES 
     (1, NULL, NULL, NULL, NULL) 
    , (2, '', NULL, NULL, NULL) 
    , (3, '', '', NULL, NULL) 
    , (4, 'VAL', 'VAL', NULL, NULL) 
    , (5, 'VAL1', 'VAL2', NULL, NULL) 
    , (6, NULL, NULL, 0, NULL) 
    , (7, NULL, NULL, 0, 0) 
    , (8, NULL, NULL, 1, 1) 
    , (9, NULL, NULL, 1, 0) 

    SELECT ID, STRVAL1, STRVAL2, BVAL1, BVAL2 
    FROM @TAB 
+1

뭔가 (필드, '') <> '' – ThatChris

+0

@Christopher는 -하지만 null 이외의면이 다른 값을 포함하는 경우 - - ISNULL과 유착에 대해 생각한다 당신이 COALESCE 경우 ' N/A '와 잘 맞지 않으면 잘못 될 것입니다 - 다른 하나는 비트 필드입니다 – Cato

답변

4

당신은 단지 비교를 사용할 수 있습니다에 대한 울부 짖는 스크립트를 사용하십시오 :

select t.* 
from @tab t 
where ((strval1 <> strval2) or 
     (strval1 is null and strval2 is not null) or 
     (strval1 is not null and strval2 is null) 
    ) or 
     ((bval1 <> bval2) or 
     (bval1 is null and bval2 is not null) or 
     (bval1 is not null and bval2 is null) 
    ); 
0

조합이 필요합니다. 시험 중. ISNULL 사용하여 같은

select ... from ... where 
(strval1 is null and strval2 is not null) or 
(strval1 is not null and strval2 is null) or 
(strval1 != strval2) or 
(bval1 is null and bval2 is not null) or 
(bval1 is not null and bval2 is null) or 
(bval1 != bval2)