Null을 사용한 SQL Server 문자열 연결


85

일부 필드가 잠재적으로 null 인 계산 열을 만들고 있습니다.

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

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


2
질문을 받았을 때 받아 들여진 대답은 맞았지만 SQL Server 2012 이상의 모든 사용자에게 (그리고이 단계는 모두가되어야 함) @ Martin-Smiths 대답이 자동으로 null을 처리하므로 가장 좋습니다.
Dowlers

답변:


142

당신이 사용할 수있는 ISNULL(....)

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

열 / 표현식의 값이 실제로 NULL이면 지정된 두 번째 값 (여기서는 빈 문자열)이 대신 사용됩니다.


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

1
그리고 ISNULL은 SQL Server에서도 좀 더 빠른 것 같습니다. 따라서 문자열을 계산 된 열로 연결하는 함수에서 사용하려는 경우 ANSI 표준을 무시 하고 속도를 선택할 수 있습니다 (Adam Machanic : sqlblog.com 참조). / blogs / adam_machanic / archive / 2006 / 07 / 12 /… )
marc_s

이 Isnull (,) 쿼리를 사용하면 값을 함께 연결하고 그중 하나가 null이면 모든 것이 null이됨에 따라 많은 문제가 발생했습니다.
Sizons

사용하기 ISNULL()좋은 솔루션 그러나 당신은 또한 사용할 수에 SQL 서버 2012입니다 CONCAT: 기능은 동일한 결과를 얻을 수 있습니다CONCAT(@Column1, @Column2)
무하마드 Musavi

2
null빈 문자열이 아닌 다른 것으로 바꾸려는 경우 즉 IsNull(@Column1, 'NULLVALUE'), IsNull교체 문자열 길이가 교체되는 열의 길이로 제한 된다는 점에 주목할 가치가 있습니다.Coalesce
Jamie

58

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*/

감사! 이것이 내가 필요했던 것입니다 !!
Shiva

이전 버전의 경우 " 'CONCAT'은 인식 된 내장 함수 이름이 아닙니다."라는 메시지가 표시되므로 COALESCE
Savage를

3
@Savage - COALESCE 실 거예요 작품은, 그냥 최초의 null 이외의 인수하지 CONCATENATE 반환 않기 때문에
codeulike

30

COALESCE를 사용하십시오 . 대신에 your_column사용 COALESCE(your_column, ''). NULL 대신 빈 문자열을 반환합니다.


OP는 문자열을 함께 연결하려고하지만 COALESCE는 그렇게하지 않을 것입니다
codeulike

12

사용하다

SET CONCAT_NULL_YIELDS_NULL  OFF 

null 값을 문자열에 연결해도 null이 발생하지 않습니다.

이것은 더 이상 사용되지 않는 옵션이므로 사용하지 마십시오. 자세한 내용은 설명서 를 참조하십시오.


11

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 

8

필드가 NULL 인지 여부에 따라 문자열 사이에 구분 기호를 추가하는 데 도움이 필요한 사람이 있으면 기여하고 싶었습니다 .

따라서 별도의 필드에서 한 줄 주소를 만드는 예에서

Address1 , Address2 , Address3 , City , PostCode

제 경우에는 원하는대로 작동하는 것처럼 보이는 다음 계산 열이 있습니다.

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

누군가에게 도움이되기를 바랍니다!


제거 할 수있는 중복 된 중첩 브라케팅이 꽤 많이 있습니다. 또 다른 팁은 address1이 null 인 것처럼 case 문을 제거 할 수도 있다는 것입니다. 전체 표현식은 null로 평가됩니다 (케이스 문을 사용하면 이런 일이 발생할 수 있다는주의가 필요합니다).
Alternator


1

나도 이것으로 많은 문제가 있었다. 위의 사례 예제를 사용하여 작동하지 못했지만 이것은 나를 위해 일합니다.

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

바꾸기는 단일 공백을 그 사이에 아무것도 연결하지 않아 발생하는 이중 공백을 수정합니다. r / ltrim 은 끝에있는 모든 공백을 제거합니다.


0

SQL Server에서 :

insert into Table_Name(PersonName,PersonEmail) values(NULL,'xyz@xyz.com')

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+"')

0

이 예제는 insert 문을 만드는 동안 다양한 유형을 처리하는 데 도움이됩니다.

select 
'insert into doc(Id, CDate, Str, Code, Price, Tag )' + 
'values(' +
      '''' + convert(nvarchar(50), Id) + ''',' -- uniqueidentifier
    + '''' + LEFT(CONVERT(VARCHAR, CDate, 120), 10) + ''',' -- date
    + '''' + Str+ ''',' -- string
    + '''' + convert(nvarchar(50), Code)  + ''',' -- int
    + convert(nvarchar(50), Price) + ',' -- decimal
    + '''' + ISNULL(Tag, '''''') + '''' + ')'  -- nullable string

 from doc
 where CDate> '2019-01-01 00:00:00.000'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.