select ifnull(null,'replaces the null')
-->replaces the null
select coalesce(null,null,'replaces the null')
-->replaces the null
両方の句の主な違いは引数の受け渡しです。 ifnull
の場合、2つのパラメーターであり、2または3を合体できますが、これら2つの間に他の違いはありますか?そして、MSSqlでの違い。
2つの主な違いは、IFNULL
関数は2つの引数を取り、NULL
でない場合は最初の引数を、最初の引数がNULL
の場合は2番目の引数を返すことです。
COALESCE
関数は2つ以上のパラメーターを取り、最初の非NULLパラメーターを返すことができます。すべてのパラメーターがNULLの場合はNULL
を返します。例:
SELECT IFNULL('some value', 'some other value');
-> returns 'some value'
SELECT IFNULL(NULL,'some other value');
-> returns 'some other value'
SELECT COALESCE(NULL, 'some other value');
-> returns 'some other value' - equivalent of the IFNULL function
SELECT COALESCE(NULL, 'some value', 'some other value');
-> returns 'some value'
SELECT COALESCE(NULL, NULL, NULL, NULL, 'first non-null value');
-> returns 'first non-null value'
PDATE: MSSQLはより厳密な型とパラメーターのチェックを行います。さらに、IFNULL
関数はありませんが、代わりにISNULL
関数があり、引数の型を知る必要があります。したがって:
SELECT ISNULL(NULL, NULL);
-> results in an error
SELECT ISNULL(NULL, CAST(NULL as VARCHAR));
-> returns NULL
また、MSSQLのCOALESCE
関数では、少なくとも1つのパラメーターがNULLでないことが必要です。したがって、
SELECT COALESCE(NULL, NULL, NULL, NULL, NULL);
-> results in an error
SELECT COALESCE(NULL, NULL, NULL, NULL, 'first non-null value');
-> returns 'first non-null value'
COALESCE
の長所COALESCE
はSQL標準関数です。
IFNULL
はMySQL固有であり、MSSQLの同等のもの(ISNULL
)はMSSQL固有です。
COALESCE
は2つ以上の引数で機能します(実際、単一の引数で機能しますが、この場合はほとんど役に立ちません:COALESCE(a)
≡a
)。
MySQLのIFNULL
およびMSSQLのISNULL
は、2つの引数のみで機能するCOALESCE
の限定バージョンです。
COALESCE
の短所Transact SQLドキュメント ごとに、COALESCE
はCASE
の単なる構文シュガーであり、は引数を複数回評価できます。詳細:COALESCE(a1, a2, …, aN)
≡CASE WHEN (a1 IS NOT NULL) THEN a1 WHEN (a2 IS NOT NULL) THEN a2 ELSE aN END
。これにより、MSSQLのCOALESCE
の有用性が大幅に低下します。
一方、MSSQLのISNULL
は通常の関数であり、その引数を複数回評価することはありません。 MySQLおよびPostgreSQLのCOALESCE
は、引数を複数回評価しません。
この時点では、SQL標準がCOALESCE
をどのように正確に定義しているかわかりません。
前のポイントからわかるように、RDBMSの実際の実装は異なります。一部(MSSQLなど)はCOALESCE
を使用して引数を複数回評価しますが、一部(MySQL、PostgreSQLなど)はそうではありません。
c-treeACE、 COALESCE
実装はSQL-92互換であると主張 、「この関数はGROUP BY句では許可されていません。この関数の引数はクエリ式にはできません。 」これらの制限が本当にSQL標準の範囲内にあるかどうかはわかりません。 COALESCE
の実際の実装のほとんど(MySQL、PostgreSQLなど)には、このような制限はありません。 IFNULL
/ISNULL
は、通常の関数として、そのような制限もありません。
特定のRDBMSでCOALESCE
の特定の制限に直面しない限り、常に標準としてCOALESCE
を使用することをお勧めしますより一般的。
例外は次のとおりです。
COALESCE(expr1, …)
はexpr1
を2回評価する場合があります)。GROUP BY
内またはc-treeACEのクエリ式での使用。SQL-Serverの違い:
IFNULL()
関数はありませんが、同様のISNULL()
関数はありません
ISNULL
は2つのパラメーターのみを取りますが、COALESCEは可変数のパラメーターを取ります
COALESCE
はANSI SQL標準に基づいていますが、ISNULL
は独自のTSQL関数です
ISNULL
とCOALESCE
の検証も異なります。たとえば、NULL
のISNULL
値はintに変換されますが、COAELSCE
の場合は型を指定する必要があります。例:
ISNULL(NULL,NULL)
:intです。
COALESCE(NULL,NULL)
:エラーをスローします。
COALESCE(CAST(NULL as int),NULL)
:有効であり、intを返します。
結果の式のデータ型の決定– ISNULL
は最初のパラメーター型を使用し、COALESCE
はCASE
式の規則に従い、最も優先度の高い値の型を返します。
ifnull
は、最初のパラメーターのnull値のみを置き換えることができます。一方、coalesce
は任意の値を別の値に置き換えることができます。標準SQLのcoalesce
を使用すると、多くのパラメーターを使用して多くの値を変換できます。
以下のコメントに従って例を編集してください。
例:coalesce(null, null, null, 'b*', null, 'null*')
は 'b *'を返し、ifnull
を使用することはできません。