web-dev-qa-db-ja.com

mysqlのisnullとcoalesceの違いは何ですか?

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での違い。

51
shree18

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'
70
Aleks G

COALESCEの長所

  • COALESCEはSQL標準関数です

    IFNULLはMySQL固有であり、MSSQLの同等のもの(ISNULL)はMSSQL固有です。

  • COALESCEは2つ以上の引数で機能します(実際、単一の引数で機能しますが、この場合はほとんど役に立ちません:COALESCE(a)a)。

    MySQLのIFNULLおよびMSSQLのISNULLは、2つの引数のみで機能するCOALESCEの限定バージョンです。

COALESCEの短所

  • Transact SQLドキュメント ごとに、COALESCECASEの単なる構文シュガーであり、は引数を複数回評価できます。詳細: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を使用することをお勧めしますより一般的。

例外は次のとおりです。

  • 長い計算式またはMSSQLの副作用のある式(ドキュメントによると、COALESCE(expr1, …)expr1を2回評価する場合があります)。
  • GROUP BY内またはc-treeACEのクエリ式での使用。
  • 等。
14
Sasha

SQL-Serverの違い:

  • IFNULL()関数はありませんが、同様のISNULL()関数はありません

  • ISNULLは2つのパラメーターのみを取りますが、COALESCEは可変数のパラメーターを取ります

  • COALESCEはANSI SQL標準に基づいていますが、ISNULLは独自のTSQL関数です

  • ISNULLCOALESCEの検証も異なります。たとえば、NULLISNULL値はintに変換されますが、COAELSCEの場合は型を指定する必要があります。例:

    • ISNULL(NULL,NULL):intです。

    • COALESCE(NULL,NULL):エラーをスローします。

    • COALESCE(CAST(NULL as int),NULL):有効であり、intを返します。

  • 結果の式のデータ型の決定– ISNULLは最初のパラメーター型を使用し、COALESCECASE式の規則に従い、最も優先度の高い値の型を返します。

5
praba

ifnullは、最初のパラメーターのnull値のみを置き換えることができます。一方、coalesceは任意の値を別の値に置き換えることができます。標準SQLのcoalesceを使用すると、多くのパラメーターを使用して多くの値を変換できます。

以下のコメントに従って例を編集してください。

例:coalesce(null, null, null, 'b*', null, 'null*')は 'b *'を返し、ifnullを使用することはできません。

0
jboi