一部のフィールドがnullになる可能性があるフィールド間で計算列を作成しています。
問題は、これらのフィールドのいずれかがヌルの場合、計算列全体がヌルになることです。 Microsoftのドキュメントから、これは予想されており、SET CONCAT_NULL_YIELDS_NULLの設定でオフにできることを理解しています。ただし、SQL Serverの他の部分への影響がわからないため、このデフォルトの動作を変更したくありません。
列がnullであるかどうかをチェックし、nullでない場合にのみ計算列式内にその内容を追加する方法はありますか?
ISNULL(....)
を使用できます
SET @Concatenated = ISNULL(@Column1, '') + ISNULL(@Column2, '')
列/式の値が実際にNULLの場合、指定された2番目の値(ここでは空の文字列)が代わりに使用されます。
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*/
COALESCE を使用します。 your_column
の代わりにCOALESCE(your_column, '')
を使用します。これは、NULLではなく空の文字列を返します。
つかいます
SET CONCAT_NULL_YIELDS_NULL OFF
null値を文字列に連結してもnullにはなりません。
これは非推奨のオプションであり、使用しないでください。詳細については、 documentation を参照してください。
また、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
フィールドがNULLであるかどうかに応じて、誰かが文字列の間にセパレーターを追加するのに助けを求めているなら、私はこれを貢献したかっただけです。
したがって、別々のフィールドから1行のアドレスを作成する例では
Address1、Address2、Address、City、PostCode
私の場合、次の計算列があり、希望どおりに機能しているようです。
case
when [Address1] IS NOT NULL
then ((( [Address1] +
isnull(', '+[Address2],'')) +
isnull(', '+[Address3],'')) +
isnull(', '+[City] ,'')) +
isnull(', '+[PostCode],'')
end
それが誰かを助けることを願っています!
ISNULL(ColumnName, '')
これにも多くの問題がありました。上記の事例を使用して動作させることができませんでしたが、これは私のために仕事をします:
Replace(rtrim(ltrim(ISNULL(Flat_no, '') +
' ' + ISNULL(House_no, '') +
' ' + ISNULL(Street, '') +
' ' + ISNULL(Town, '') +
' ' + ISNULL(City, ''))),' ',' ')
置換は、間にスペースがない単一のスペースを連結することによって引き起こされる二重スペースを修正します。 r/ltrimは、末尾のスペースを取り除きます。
SQL Serverの場合:
insert into Table_Name(PersonName,PersonEmail) values(NULL,'[email protected]')
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+"')
この例は、挿入ステートメントの作成中にさまざまなタイプを処理するのに役立ちます
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'