2017-01-21 9 views
0

SQL Server 2014を使用していますが、別の列の項目を含むアドレス一覧の表があります。例えばSQL Server:値を連結し、NULL値または空白値を無視します。

st number Prefix st name suffix Dir unit number city zip 
___________________________________________________________________________ 
1234  W  Main  St  NULL Unit  34  LA  90210 
345  NULL  George  Ave  NULL NULL  NULL  SF  94525 
123  E  Bloom  Ct  W  NULL  NULL  DC  99342 

が、私はこれらのアドレスを連結して1つのセルにそれらを結合したいです。

主な目標は、その連結アドレスを使用して別のテーブルにリンクすることです。私は空白の値を無視するISNULLを使用して連結する場合、たとえば、それは私にこの

345 _ George Ave _ _ _ SF 94525. 

を与えるだろう(私はスペースが使用されている場所を示すために_を追加しました)

があるときにはスペースが追加されますヌル値。スペースがある場合、他のテーブルへのリンクは機能しません。私はCOALESCEを試しましたが、うまくいきませんでした。私はCoalesceにあまり慣れていませんが、私はCOALESCEが私に最初の非ヌル値だけを与えると思います。結果として欲しいものは:

1234 W Main St Unit 34 LA 90210 
345 George Ave SF 94525 
123 E bloom Ct W DC 99342 

これらの項目を空白なしで組み合わせて、null値を得る方法を教えてください。助けてください。おかげ

+0

ポストあなたはスペースがある場合は、他のテーブルへのリンクをして部分アドレスに参加を計画するにはどうすればよい... work.'ません ' – WillardSolutions

+0

すでに試したコード余分なスペースがない場合でも情報が欠落していますか? –

答えて

2

Prdpの回答に基づいて、単純な置き換え(または2つ)で、二重または三重のスペースを排除できます。

Declare @YourTable table ([st number] varchar(25),Prefix varchar(25),[st name] varchar(25),suffix varchar(25),Dir varchar(25),unit varchar(25),number varchar(25),city varchar(25),zip varchar(25)) 
Insert Into @YourTable values 
('1234','W' ,'Main' ,'St' ,NULL,'Unit','34','LA','90210'), 
('345' ,NULL,'George','Ave',NULL,NULL ,NULL,'SF','94525'), 
('123' ,'E' ,'Bloom' ,'Ct' ,'W' ,NULL ,NULL,'DC','99342') 

Select FullAddress = replace(replace(concat([st number],' ',Prefix,' ',[st name],' ',suffix,' ',Dir,' ',unit,' ',number,' ',city,' ',zip),' ',' '),' ',' ') 
From @YourTable A 

戻り

FullAddress 
1234 W Main St Unit 34 LA 90210 
345 George Ave SF 94525 
123 E Bloom Ct W DC 99342 
+0

あなたの答えを見てゴーダンが私の答えについて言っていたことを理解しました –

+0

@Prdp私はコンカットアプローチに傾いています。私はそれがより速いのかどうか分かりませんが、私の小さな頭では、よりきれいに見えます。 –

+0

最も重要なのは暗黙の変換です。私はそれが好きです。私はそれを忘れてしまった:/。私が使用している限り、 'FORMAT'のような' CONCAT'関数ではパフォーマンス上の問題はありません;) –

1

あなたは行うことができます:文字列の最後に残りのスペースを残し

select (coalesce(st_number + ' ', '') + 
     coalesce(prefix + ' ', '') + 
     coalesce(st_name + ' ', '') + 
     . . . 
     ) 

を。 rtrim()を使用して削除できます。

select rtrim(coalesce(st_number + ' ', '') + 
      coalesce(prefix + ' ', '') + 
      coalesce(st_name + ' ', '') + 
      . . . 
      ) 

Prdpが指摘するように、これは列が実際に文字列であることを前提としています。それ以外の場合は、これらの列に対して明示的な変換が必要です(または、+の代わりにconcat()関数を使用できます)。

+0

カラム自体が 'NULL'の場合、' st_number + '' 'は' NULL'であるとコメントする必要があります。 –

+0

これは、列が暗黙的に最優先のデータ型に変換可能であると見なします。データ型が 'numeric'のとき、' Coalesce'の空文字列と空白は '0'に変換されます –

+0

@Prdp。 。 。それは良い点です。 –

関連する問題