2017-01-30 7 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です。これが起こると、出力に一連のダッシュが付けられます。フィールドが空白のときにそれらを取り除く方法はありますか?ここでは出力の例です:

Company123 - 国 - LC BR - BR - RCL - 5510-RC BR(V) - EM - DG - - - - - - -

+0

ご希望の場合は、末尾のダッシュを削除するには、出力のいくつかの独立した解析を行うことができます。それはSQL(例えばPHP)を呼び出す言語で行う必要があります –

+0

私は本当にその能力を持っていないフロントエンドを使用しているので私は私のクエリでそれを行うことができるようにしたいと思います。 – tsqln00b

+0

ええと、SQLクエリの出力には何もできないフロントエンドはありますか? –

答えて

0

場合と、あなたのフィールドを囲み声明:

(IF (field not null) then field) 
0

は、SQL Serverのバージョンを指定していないので、私は、SQL Server 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連結し、一緒値として結果を返します。

第2のselectは、末尾に向かって連結されたヌルフィールドによって生じる末尾の空白とダッシュを削除します。

ロジックは、すべての値がnull、中間値がnull、最後がnull、最後がnullのようなシナリオを処理できます。

+1

最後のフィールドがnullの場合はどうなりますか? – tsqln00b

+0

@ tsqln00b良い点。これとシナリオのバリエーションを処理するコードを修正しました。 – HappyTown

0

各連結部分内に' - '+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 
関連する問題