2017-01-30 1 views
3

CONCAT() 함수를 사용하여 몇 개의 문자열 필드를 연결합니다. 다음은 코드입니다.CONCAT 문에서 null 필드를 제거하려면 어떻게해야합니까?

CONCAT(a.[OrganizationalUnit], ' - ', a.[Level1], ' - ', a.[Level2], ' - ', a.[Level3], ' - ', a.[Level4], ' - ', a.[Level5], ' - ', a.[Level6], ' - ', a.[Level7], ' - ', a.[Level8], ' - ', a.[Level9], ' - ', a.[Level10], ' - ', a.[Level11], ' - ', a.[Level12], ' - ', a.[Level13], ' - ', a.[Level14]) AS Organization 

일부 필드는 null입니다. 이 경우 출력에 일련의 대시가 표시됩니다. 필드가 비어있는 경우 제거 할 수있는 방법이 있습니까? 다음은 출력의 예입니다 : - 나라 - LC BR - BR - RCL - 5510 - RC BR (V) -

Company123는 EM은 - DG - - - - - - - - - - -

+0

당신은 당신이 원하는 경우 후행 대시를 제거하는 출력의 일부 별도의 구문 분석을 할 수 있습니다. SQL (예 : PHP) –

+0

을 호출하는 언어에서 수행해야합니다. 프런트 엔드에 해당 기능이 실제로 없기 때문에 쿼리에서이 작업을 수행 할 수 있기를 원합니다. – tsqln00b

+0

음, 어떤 종류의 프론트 엔드를 가지고 있어도 SQL 쿼리의 결과물에는 아무 것도 할 수 없습니까? –

답변

0

는 IF와 함께 필드를 서라운드 문 :

(IF (field not null) then field) 
0

당신은 SQL 서버 버전을 지정하지 않은, 그래서 SQL 서버 2012 이상을 가정하고 SQL 2012 이상에서 사용할 수 있습니다 iif (즉시 경우)를 사용합니다. 더 많은 정보보기 MSDN

아래의 솔루션은 일부 실행 코드를 예제로 보여주기 위해 변수를 사용합니다. 변수를 열 이름으로 바꿀 수 있습니다.

declare 
    @column1 varchar(10) = 'c1', 
    @column2 varchar(10) = null, 
    @column3 varchar(10) = 'c3', 
    @column4 varchar(10) = 'c4', 
    @column5 varchar(10) = null, 
    @column6 varchar(10) = null, 
    @columnN varchar(10) = null -- 'cN' 

declare @concatenated varchar(100) 

select @concatenated = 
    rtrim 
    (
     concat 
     (
      iif(@column1 is not null, concat(@column1, ' - '), ''), 
      iif(@column2 is not null, concat(@column2, ' - '), ''), 
      iif(@column3 is not null, concat(@column3, ' - '), ''), 
      iif(@column4 is not null, concat(@column4, ' - '), ''), 
      iif(@column5 is not null, concat(@column5, ' - '), ''), 
      iif(@column6 is not null, concat(@column6, ' - '), ''), 
      @columnN 
     ) 
    ) 

select rtrim(left(@concatenated, len(@concatenated) - patindex('%[^-]%', reverse(@concatenated))+1)) as 'Result' 

이 복귀 c1 - c3 - c4

select 연접과 같은 값을 함께 초래한다.

두 번째 select은 끝 부분에 연결된 널 (null) 필드로 인한 뒤 공백과 대시를 제거합니다.

논리는 모든 값이 null, 중간 값이 null, 마지막 값이 null, 마지막 값이 null 인 시나리오를 처리 할 수 ​​있습니다.

+1

마지막 필드가 null 인 경우는 어떻게됩니까? – tsqln00b

+0

@ tsqln00b 좋은 지적. 이 시나리오와 시나리오 변형을 처리하기 위해 코드를 수정했습니다. – HappyTown

0

각 concat 부분 내에 ' - '+a.Leveln을 중첩하십시오.

Declare @YourTable table ([OrganizationalUnit] varchar(10),Level1 varchar(10),Level2 varchar(10),Level3 varchar(10),Level4 varchar(10),Level5 varchar(10),Level6 varchar(10),Level7 varchar(10),Level8 varchar(10),Level9 varchar(10),Level10 varchar(10),Level11 varchar(10),Level12 varchar(10),Level13 varchar(10),Level14 varchar(10),Level15 varchar(10)) 
Insert Into @YourTable (OrganizationalUnit,Level1,Level2) values ('Org Unit','LevelOne','LevelTwo') 

Select CONCAT(a.[OrganizationalUnit], ' - '+a.[Level1], ' - '+ a.[Level2], ' - '+ a.[Level3], ' - '+ a.[Level4], ' - '+ a.[Level5], ' - '+ a.[Level6], ' - '+ a.[Level7], ' - '+ a.[Level8], ' - '+ a.[Level9], ' - '+ a.[Level10], ' - '+ a.[Level11], ' - '+ a.[Level12], ' - '+ a.[Level13], ' - '+ a.[Level14]) 
From @YourTable A 

반환

Org Unit - LevelOne - LevelTwo 
관련 문제