2010-05-26 4 views
64

일부 필드가 null 일 가능성이있는 여러 계산 된 열을 만듭니다.null로 SQL Server 문자열 연결

해당 필드 중 하나라도 null이면 계산 된 전체 열이 null이됩니다. Microsoft 문서에서 이것이 예상되며 SET CONCAT_NULL_YIELDS_NULL 설정을 통해 해제 할 수 있음을 이해합니다. 그러나 SQL Server의 다른 부분에 대한 영향을 알지 못하기 때문에이 기본 동작을 변경하고 싶지 않습니다.

열이 null인지 여부를 확인하고 해당 열이 null이 아닌 경우 계산 된 열 수식에만 추가 할 수있는 방법이 있습니까?

답변

110

당신은 다음 두 번째 값 (빈 문자열 여기) 지정 ISNULL(....)

SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '') 

를 사용할 수 있습니다. SQL Server의

+13

"Coalesce"는 ANSI 표준 함수 이름이지만 ISNULL은 철자가 쉽습니다. –

+1

그리고 ISNULL은 SQL Server에서도 빠르다. 문자열을 계산 된 열로 연결하는 함수에서 ISNULL을 사용하려는 경우 ANSI 표준을 무시하고 속도를 선택할 수 있습니다 (Adam Machanic : http : //sqlblog.com/blogs/adam_machanic/archive/2006/07/12/performance-isnull-vs-coalesce.aspx) –

+0

그냥이 Isnull (,) 쿼리를 사용했습니다. 값을 연결하고 if 그들 중 하나는 모두 null이되었다. – Sizons

27

COALESCE을 사용하십시오. your_column 대신 COALESCE(your_column, '')을 사용하십시오. 이렇게하면 NULL 대신 빈 문자열이 반환됩니다. 대신 사용됩니다 : 컬럼/식의 값이 실제로 NULL 인 경우

6

ISNULL(ColumnName, '')

0

: 뒤에

insert into Table_Name(PersonName,PersonEmail) values(NULL,'[email protected]') 

PersonName is varchar(50), NULL is not a string, because we are not passing with in single codes, so it treat as NULL. 

코드 : 난 그냥이 기여하고 싶었

string name = (txtName.Text=="")? NULL : "'"+ txtName.Text +"'"; 
string email = txtEmail.Text; 

insert into Table_Name(PersonName,PersonEmail) values(name,'"+email+"') 
7

누군가는 문자열 사이에 구분을 추가하는 방법에 따라 함께 도움을 찾고해야 필드가 NULL인지 여부 에 주소 1, 주소 2, Address3, 도시, 우편 번호

을 별도의 필드

에서 한 줄에 주소를 생성하는 예에 따라서

내 경우, 나는 그것을 원하는대로 작동하는 것 같습니다 다음 계산 된 열 있습니다 :

case 
    when [Address1] IS NOT NULL 
    then (((   [Address1]  + 
      isnull(', '+[Address2],'')) + 
      isnull(', '+[Address3],'')) + 
      isnull(', '+[City] ,'')) + 
      isnull(', '+[PostCode],'') 
end 

누군가를 돕는 희망!

+0

제거 할 수있는 중복 된 중첩 된 브라케팅이 꽤 있습니다. 또 다른 팁은 address1이 null 인 것처럼 case 문을 제거 할 수 있다는 것입니다. case 문을 사용하면이 문제가 발생할 수 있음을 알게되지만 전체식이 null로 평가됩니다. – Alternator

38

SQL Server 2012에서이 기능은 CONCAT 기능을 사용하면 훨씬 쉽습니다.

이 빈 문자열로 NULL 취급

DECLARE @Column1 VARCHAR(50) = 'Foo', 
     @Column2 VARCHAR(50) = NULL, 
     @Column3 VARCHAR(50) = 'Bar'; 


SELECT CONCAT(@Column1,@Column2,@Column3); /*Returns FooBar*/ 
+0

감사합니다! 이것은 내가 필요로했던 것이었다!! – Shiva

+0

이전 버전의 경우 " 'CONCAT'이 (는) 인식 된 내장 함수 이름이 아닙니다. 따라서 COALESCE를 사용하십시오 – Savage

7

또한 CASE 사용할 수 있습니다 - 만있을 경우 값이 따라 null 값과 빈 문자열을 모두 확인 아래에있는 내 코드를, 그리고 구분자를 추가

SELECT OrganisationName, 
'Address' = 
CASE WHEN Addr1 IS NULL OR Addr1 = '' THEN '' ELSE Addr1 END + 
CASE WHEN Addr2 IS NULL OR Addr2 = '' THEN '' ELSE ', ' + Addr2 END + 
CASE WHEN Addr3 IS NULL OR Addr3 = '' THEN '' ELSE ', ' + Addr3 END + 
CASE WHEN County IS NULL OR County = '' THEN '' ELSE ', ' + County END 
FROM Organisations 
10
사용

SET CONCAT_NULL_YIELDS_NULL OFF 

과 일에 null 값의 연결 반지는 null이되지 않습니다.

사용하지 않는 것이 좋습니다. 자세한 내용은 documentation을 참조하십시오.

0

나는 이것에 대해서도 많은 어려움을 겪었다.

Replace(rtrim(ltrim(ISNULL(Flat_no, '') + 
' ' + ISNULL(House_no, '') + 
' ' + ISNULL(Street, '') + 
' ' + ISNULL(Town, '') + 
' ' + ISNULL(City, ''))),' ',' ') 

교체는 그들 사이에 아무 것도 하나의 공간을 연결하여 발생하는 이중 공간을 수정합니다 : 그것은 위의 경우 예제를 사용하여 작업,하지만 나를 위해 일을 가져올 수 없습니다. r/ltrim은 끝 부분에 공백을 제거합니다.