web-dev-qa-db-ja.com

NULLフィールドの連結

FirstName、LastName、Emailの3つのフィールドを持つテーブルがあります。

ダミーデータを次に示します。

FirstName | LastName | Email
Adam        West       [email protected]
Joe         Schmoe     NULL

今、私がそうするなら:

SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS

単一のヌルフィールドがあるため、ジョーのバイタルはヌルです。この振る舞いをどのように克服しますか?また、これはMS SQL Serverのデフォルトの動作ですか?

59
Thomas R

試して

ISNULL(FirstName, '<BlankValue>') -- In SQL Server
IFNULL(Firstname, '<BlankValue>') -- In MySQL

そう、

CONCAT(ISNULL(FirstName,''),ISNULL(LastName,''),ISNULL(Email,'')) -- In SQL Server
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,'')) -- In MySQL

nullの問題(およびnullが存在するはずの空白文字列)なしで同じものを返します。

118
Stefan Mai

見る CONCAT_WS

例えば:

CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")

利回り

TEST STRINGTEST STRING 2

これは、すべての周りにIFNULLを構築するよりも簡単です。空の文字列をセパレータとして使用できます。

67
BILBO

Mysqlでは、isnullはしばらく動作しません。 IFNULL()を試してください。

CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
12
chaladi
SELECT ISNULL(FirstName,'')+ISNULL(LastName,'')+ISNULL(Email,'') as Vitals FROM MEMBERS

をお勧めしますが、CONCATに本当に夢中になっている場合は、{fn}でラップし、ODBC関数を次のように使用できます。

SELECT {fn CONCAT(ISNULL(FirstName,''), ISNULL(LastName,''), ISNULL(Email,''))} as Vitals FROM MEMBERS

First <space> lastが必要で、firstがnullのときに最後が必要な場合、これを行うことができます。

ISNULL(FirstName+' ','') + ISNULL(LastName,'')

Nullの可能性のあるfirstnameにスペースを追加しました。つまり、FirstNameに値がある場合にのみスペースが存続することを意味します。

それらをすべてスペースで区切ってまとめるには:

RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
6
Hafthor

CONCAT_NULL_YIELDS_NULL設定をいつでも使用できます。

単にSET CONCAT_NULL_YIELDS_NULL OFFを実行すると、すべてのnull連結はnullではなくテキストになります。

5

ステファンの答えは正しいです。少し詳しく調べるには、NULLがNothingと同じではないことを知る必要があります。 Nullは、値がないこと、つまり定義されていないことを表します。 IS実際には値です。空の文字列を表すものはありません。

未定義+何でも=未定義

保持する良いデータベースのヒント!

3
Brian

取得した場合(MySQLでのように):

#1582 - Incorrect parameter count in the call to native function 'ISNULL'

ISALE関数をCOALESCEに置き換えることができます:

CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
3
jmarceli

SQL ServerにはCONCAT関数がありません。
(更新:MS SQL Server 2012以降 CONCAT関数が導入されました

SQL Serverのデフォルトの動作では、NULLは式を介して伝播します。

SQL Serverでは、次のように記述します。

SELECT FirstName + LastName + Email as Vitals FROM MEMBERS

NULLsを処理する必要がある場合:

SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
2
Cade Roux

MS SQL Server 2012以降、CONCAT関数と MSDNによる が導入されました

NULL値は暗黙的に空の文字列に変換されます。すべての引数がヌルの場合、varchar(1)型の空の文字列が返されます。

したがって、IsNullなしでCONCATを使用するだけで十分です。

CONCAT(FirstName, LastName, Email)
2

MS Accessの場合

オプション1)メンバーからのバイタルとしてSELECT(FirstName + "" + LastName + "" +メール).

オプション2)メンバーからのバイタルとしてSELECT(FirstName& ""&LastName& ""&Email).

1
vaibhav sarode

この質問に対する答えを観察した後、それらすべてを1つの簡単なソリューションにまとめることができます

CONCAT_WS(',',
IF(NULLIF(FirstName, '') IS NULL, NULL, FirstName),
IF(NULLIF(LastName, '') IS NULL, NULL, usr_lastname),
IF(NULLIF(Email, '') IS NULL, NULL, Email))

So、要するにCONCAT_WSを使用してフィールドを連結し、,で区切るNULLフィールドもEMPTYも連結されないことに注意してください

[〜#〜] nullif [〜#〜]は、フィールドがNULLまたはEMPTYであるかどうかを確認します。フィールドはスペースのみを含むか、空でもあります。例: ''、 '')、出力はNULLまたはNOT NULLのいずれかになります

[〜#〜] if [〜#〜]NULLまたはEMPTYでない場合、フィールドを出力します

0
Eiad Samman