2012-01-08 3 views
4

나는이 코드를 업데이트해야 할 때와 비슷한 질문을 게시했다. 나는 후속 질문을하기 위해 돌아왔다. 이전 질문은 여기에 있습니다 :
Computed column based on nullable columnsComputed Column (COALESCE vs CASE vs ISNULL)

내 데이터 (Address1, Address2, City, State, Zip, Country은) 불완전한 정보가있을 수 있습니다. 나는. StateCountry 열 이외의 데이터에는 데이터가 보장되지 않습니다.

FullAddress에 대한 계산 열을 갖고 싶습니다.

이전에는 모든 입력란을 채우면 큰 효과를 보았던 COALESCE을 사용했습니다. 이제는 데이터 요구 사항이 완화되어 더 이상 선택 사항이 아닙니다 (FullAddress에 반복되는 쉼표로 끝남). 여기 내가 이전에 사용했던 것입니다 (참고, 사용 편의성을 위해 여기 SELECT 문을 사용하고 있습니다 - 모든 경우에 사용할 수있는 무언가를 계산 열 "alter table add"로 변환합니다)) :

(처음 두 문자로 ','이 문제 FullAddress이있을 것입니다)

SELECT (((((COALESCE([Address1],'') 
    + COALESCE(', '+[Address2],'')) 
    + COALESCE(', '+[City],'')) 
    + COALESCE(', '+[State],'')) 
    + COALESCE(', '+[Zip],'')) 
    + COALESCE(', '+[Country],'')) AS FullAddress 
FROM Locations 

지금, 나는 함께 CASE를 사용하여 대안을 넣어,하지만 Address1 is NULL 어디 여전히 가장자리 경우에 작동하지 않습니다

SELECT CASE WHEN [Address1] IS NOT NULL THEN [Address1] ELSE '' END 
     + CASE WHEN [Address2] IS NOT NULL THEN ', ' + [Address2] ELSE '' END 
     + CASE WHEN [City] IS NOT NULL THEN ', ' + [City] ELSE '' END 
     + CASE WHEN [State] IS NOT NULL THEN ', ' + [State] ELSE '' END 
     + CASE WHEN [Zip] IS NOT NULL THEN ', ' + [Zip] ELSE '' END 
     + CASE WHEN [Country] IS NOT NULL THEN ', ' + [Country] ELSE '' END 
     AS [FullAddress] 
FROM Locations 

나는이 po에 조금 붙어 있습니다. int. 다음에 시도 할 추천 사항은 무엇입니까?

+0

무엇이 문제입니까? –

+0

내 질문은 : 어떻게 누락 된 데이터 (예 : Address1 누락) FullAddress 계산 열이 ',' –

답변

6

당신은이 패턴을 사용할 수 있습니다

SELECT 
    ISNULL(Address1 + ', ', '') 
    + ISNULL(Address2 + ', ', '') 
    + ISNULL(City + ', ', '') 
    -- .... 
    AS FullAddress 

concation NULL + ', '의 결과는 NULL =입니다>Address1 + ', ' 될 것입니다 NULL 또는 유효한 주소 =>ISNULL(Address1 + ', ', '') 빈 문자열 또는 유효한 주소가됩니다.

+0

시작되지 않습니다. NULL을 SQL에서 아무것도 NULL로 유지됩니다. –

+2

귀하의 데이터 요구 사항이 얼마나 "안락한"것인지 잘 모릅니다. 예를 들어 'City' 열에 만 데이터가 있습니다. 결과에는 마지막에 여분의', '이 있습니다. 어쩌면 사용자 정의 함수 사용을 고려해야합니다. – bfavaretto

2
SELECT STUFF(
     COALESCE(', ' + Address1, '') + COALESCE(', ' + Address2, '') + ... 
     1, 
     2, 
     '' 
     ) AS FullAddress 
FROM Locations 

연결된 문자열입니다은 비어 있거나 (콤마와 스페이스)로 시작됩니다 중 하나. STUFF()은 처음 두 문자를 제거하고 나머지 문자열을 반환합니다.