2010-08-19 3 views
2

비슷한 데이터를 가진 두 테이블 간의 통합을 수행하는 쿼리를 작성해야합니다. 결과는 구별되어야합니다. 내가 가진 문제는 같은 값을 가져야하는 필드가 빈 값일 때가 아니라는 것입니다. 일부는 null로 표시되고 일부는 빈 문자열 값을가집니다. 내 질문은 다음 쿼리를 수행하는 더 좋은 방법은 무엇입니까? (적절한 기본값이 설정되도록 실제 데이터를 수정하지 않고) 등등을 사용합니다.NULL 및 빈 문자열 값을 처리 할 때 유니온 쿼리를 작성하는 가장 좋은 방법

Select 
    When Column1 = '' Then NULL Else Column1 as [Column1], 
    When Column2 = '' Then NULL Else Column2 as [Column2] 
From TableA 

UNION ALL 

Select 
    When Column1 = '' Then NULL Else Column1 as [Column1], 
    When Column2 = '' Then NULL Else Column2 as [Column2] 
From TableB 

답변

2

나는 그것이 어떤 차이를 만들 것이라고 생각하지 않는다 성능,하지만 NULLIF 이것을 쓰는 또 다른 방법이며, IMHO, 조금 청소기 보인다.

Select 
    NULLIF(Column1, '') as [Column1], 
    NULLIF(Column2, '') as [Column2] 
From TableA 

UNION 

Select 
    NULLIF(Column1, '') as [Column1], 
    NULLIF(Column2, '') as [Column2] 
From TableB 
+0

NULLIF에 대한 메모를 보내 주셔서 감사합니다. ''또는 NULL을 반환하는 것이 더 낫습니다. – dretzlaff17

+0

데이터를 선택하면 데이터로 무엇을하고 있는지에 따라 달라집니다. 다시 말하지만 성능 차이가 없으면 하나를 반환합니다. –

+0

성능은 문제가 아니기 때문에 ''이 레코드에 대해 발견되면 NULL을 반환해야합니다. IFNULL 또는 NULLIF에 대한 역 논리를 알지 못하기 때문에 그대로 유지하려고합니다. 의견을 보내 주신 모든 분들께 감사드립니다. – dretzlaff17

1
Case 잘 수행해야

하지만 IsNull은이 상황에서 더 자연스러운 것입니다. 그리고 당신은 (이 지적에 대해 제프리 L Whitledge 덕분에) 그 작업을 수행하는 union all 대신 union을하고, 별개의 행을 검색하는 경우 :

select IsNull(col1, '') 
,  IsNull(col2, '') 
from TableA 
union 
select IsNull(col1, '') 
,  IsNull(col2, '') 
from TableB 
+0

거꾸로 생각한 것 같습니다. 칼럼이 ''와 같을 때 OP는 NULL을 원한다. –

+0

SQL 서버에서는 'union'에 대한 귀하의 특성이 올바르지 않습니다. 'union '은 소스에 관계없이 결과에서 모든 중복 행을 제거합니다. –

+0

@Joe Stefenelli : 내가 읽은 방법, OP는 단지 그가 같은 결과를 원한다고 말합니다 @Jeffrey L Whitledge : 고마워, 그걸 몰랐어! 답변 편집 됨 – Andomar

0

당신은 당신이 다음 별도의 뷰 (대신 빈 문자열을 NULL), 노동 조합보기를 원하는대로 조작 할 경우 조작 작업이 노조에서 분리 유지할 수 있습니다.

두 세트 모두에서 동일한 조작을 적용하지 않아도됩니다.

그런 경우 먼저 조합 한 다음 결과 인 unioned 집합에 한 번 적용합니다.

이렇게 많은 수의 조작 코드가 지원됩니다.

1

사용 UNION 중복을 제거하는 - 그것은이 기능에 대한 UNION ALL보다 느린입니다 :

SELECT CASE 
     WHEN LEN(LTRIM(RTRIM(column1))) = 0 THEN NULL 
     ELSE column1 
     END AS column1, 
     CASE 
     WHEN LEN(LTRIM(RTRIM(column2))) = 0 THEN NULL 
     ELSE column2 
     END AS column2 
    FROM TableA 
UNION 
SELECT CASE 
     WHEN LEN(LTRIM(RTRIM(column1))) = 0 THEN NULL 
     ELSE column1 
     END, 
     CASE 
     WHEN LEN(LTRIM(RTRIM(column2))) = 0 THEN NULL 
     ELSE column2 
     END 
    FROM TableB 

나는 열 값에 공백이 임의의 수와 실제 내용이 포함 된 경우 NULL을 반환하는 논리를 변경했습니다.

CASE 표현식은 ANSI이며 NULLIF/etc 구문보다 사용자 정의 할 수 있습니다.

관련 문제