質問
FirstName、LastName、Emailの3つのフィールドを持つテーブルがあります。
ここにいくつかのダミーデータがあります:
FirstName | LastName | Email
Adam West adam@west.com
Joe Schmoe NULL
今、私がそうするなら:
SELECT CONCAT(FirstName, LastName, Email) as Vitals FROM MEMBERS
単一のnullフィールドがあるため、Joeのバイタルはnullです。この振る舞いをどのように克服しますか?また、これはMS SQL Serverのデフォルトの動作ですか?
解決
試用
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があるはずの空の文字列)。
他のヒント
CONCAT_WS
例:
CONCAT_WS('',NULL,"TEST STRING","TEST STRING 2")
歩留まり
TEST STRINGTEST STRING 2
これは、すべての周りにIFNULL
を構築するよりも簡単です。空の文字列をセパレータとして使用できます。
mysqlでは、isnullはしばらく動作しません。 IFNULL()を試してください。
CONCAT(IFNULL(FirstName,''),IFNULL(LastName,''),IFNULL(Email,''))
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 <!> lt; space <!> gt; lastが必要な場合、firstがnullの場合は最後になります:
ISNULL(FirstName+' ','') + ISNULL(LastName,'')
firstnameにnullの可能性のあるスペースを追加しました。つまり、FirstNameに値がある場合にのみスペースが存続することを意味します。
それらをすべてスペースで区切ってまとめるには:
RTRIM(ISNULL(Firstname+' ','') + ISNULL(LastName+' ','') + ISNULL(Email,''))
いつでもCONCAT_NULL_YIELDS_NULL
設定を使用できます。
単にSET CONCAT_NULL_YIELDS_NULL OFF
を実行すると、すべてのnull
連結はnullではなくテキストになります。
ステファンの答えは正しいです。 少し詳しく調べるには、NULLがNothingと同じではないことを知る必要があります。 Nullは、値がないこと、つまり定義されていないことを表します。実際には値である空の文字列を表すものはありません。
未定義+何でも=未定義
保持するのに適したデータベースのヒント!
取得した場合(MySQLでのように):
#1582 - Incorrect parameter count in the call to native function 'ISNULL'
ISNULL関数をCOALESCEに置き換えることができます:
CONCAT(COALESCE(FirstName,''),COALESCE(LastName,''),COALESCE(Email,''))
MS SQL Server 2012以降、CONCAT関数が導入されました および MSDNに従って
ヌル値は暗黙的に空の文字列に変換されます。すべての場合 引数がnullの場合、varchar(1)型の空の文字列が返されます。
したがって、IsNullなしでCONCATを使用するだけで十分です
CONCAT(FirstName, LastName, Email)
SQL ServerにはCONCAT
関数がありません。
(更新:MS SQL Server 2012以降 CONCAT関数が導入されました )
デフォルトのSQL Serverの動作では、NULLは式を介して伝播します。
SQL Serverでは、次のように記述します。
SELECT FirstName + LastName + Email as Vitals FROM MEMBERS
NULL
sを処理する必要がある場合:
SELECT ISNULL(FirstName, '') + ISNULL(LastName, '') + ISNULL(Email, '') as Vitals FROM MEMBERS
MS Accessの場合
Option 1)SELECT(FirstName + <!> quot; <!> quot; + LastName + <!> quot; <!> quot; + Email)as Vitals FROM MEMBERS nullのフィールドの場合、結果は空白になります。
オプション2)SELECT(FirstName <!> amp; <!> quot; <!> quot; <!> amp; LastName <!> amp; <!> quot; <!> quot; <!> amp;メール)メンバーからのバイタルとして nullのフィールドの代わりにスペースを取得します。
この質問に対する回答を確認した後、それらすべてを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))
したがって、要するに、CONCAT_WS
を使用してフィールドを連結し、,
で区切ります。 NULL
フィールドもEMPTY
も連結されないことに注意してください
NULLIF は、フィールドがNOT NULL
または<=>であるかどうかを確認します。フィールドはスペースのみを含むか、空でもあります。例: ''、 '')、出力は<=>または<=>
IF フィールドが<=>または<=>
でない場合、フィールドに出力します