Nullを使用したSQLServer文字列の連結


85

一部が潜在的にnullであるフィールド全体に計算列を作成しています。

問題は、これらのフィールドのいずれかがnullの場合、計算列全体がnullになることです。Microsoftのドキュメントから、これは予期されたものであり、SETCONCAT_NULL_YIELDS_NULLの設定でオフにできることを理解しています。ただし、SQL Serverの他の部分への影響がわからないため、このデフォルトの動作を変更したくありません。

列がnullかどうかを確認し、nullでない場合は、計算された列の数式内にその内容を追加する方法はありますか?


2
受け入れられた答えは、質問が行われた時点では正しかったが、SQL Server 2012以降のすべての人(そしてこの段階はすべての人でなければならない)にとっては、@ Martin-Smithsの答えは、nullを自動的に処理するので最適です。
ダウラーズ

回答:


142

使用できます ISNULL(....)

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

列/式の値が実際にNULLの場合、指定された2番目の値(ここでは空の文字列)が代わりに使用されます。


22
「Coalesce」はANSI標準の関数名ですが、ISNULLの方がスペルが簡単です。
フィリップケリー2010年

1
また、ISNULLはSQL Serverでも少し速いようです。したがって、文字列を計算列に連結する関数で使用する場合は、ANSI標準を使用せずに、速度を選択することができます(Adam Machanic:sqlblog.comを参照)。/ blogs / adam_machanic / archive / 2006/07/12 /…
marc_s 2010年

このIsnull(、)クエリを使用しただけで、値を連結していたため、多くの問題が発生しました。値の1つがnullの場合、すべてもnullになりました。
Sizons 2016

使用すると、ISNULL()良い解決策ですが、上の2012 SQL Serverからの、あなたも使用することができ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*/

ありがとう!これが私が必要としていたものでした!
シヴァ

古いバージョンの場合、「 'CONCAT'は認識された組み込み関数名ではありません」と表示されるため、COALESCE
Savage

3
@ Savage-COALESCEは連結しないため機能せず、最初のnull以外の引数を返すだけです
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であるかどうかに応じて、誰かが文字列の間に区切り文字を追加するためのヘルプを探している場合に、これを提供したかっただけですです。

したがって、別々のフィールドから1行の住所を作成する例では

アドレス1アドレス2アドレス3郵便番号

私の場合、次の計算列があり、希望どおりに機能しているようです。

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

それが誰かを助けることを願っています!


削除できる冗長なネストされたブラケットがかなりあります。もう1つのヒントは、address1がnullであるかのように、caseステートメントを削除することもできます(ただし、caseステートメントがあると、これが発生する可能性があることに注意が向けられます)
オルタネーター


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

この例は、挿入ステートメントを作成するときにさまざまなタイプを処理するのに役立ちます

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.