2

データベースからの null 値をインターセプトするには 2 つのオプションがあるため...

  1. 無効です
  2. 合体

以下は、上記の 2 つの関数のクエリを作成する方法です...

Select IsNull(Columnname, '') As validColumnValue From TableName

Select Coleasce(Columnname, '') As validColumnValue From TableName

クエリ - どの状況でどちらを優先すべきか、またその理由は?

4

3 に答える 3

5

これはハッシュ化され、再ハッシュ化されています。上記のコメントとリンクと説明で指摘したヒントに加えて、リクエストにより、サブクエリを使用したCOALESCEとISNULLの説明があります。結果の点で同一であるこれらの2つのクエリを考えてみましょう。

SELECT COALESCE((SELECT TOP (1) name FROM sys.objects), N'foo');

SELECT ISNULL((SELECT TOP (1) name FROM sys.objects), N'foo');

(ORDERBYなしでTOPを使用することについてのコメント/dev / null /に感謝します。)

COALESCEの場合、ロジックは実際には次のように拡張されます。

SELECT CASE WHEN (SELECT TOP (1) ...) IS NULL
    THEN (SELECT TOP (1) ...)
    ELSE N'foo'
END

ISNULLでは、これは発生しません。サブクエリが1回だけ評価されるようにする内部最適化があります。マイクロソフト以外の誰かがこの最適化がどのように機能するかを正確に知っているかどうかはわかりませんが、計画を比較すればこれは可能です。COALESCEバージョンの計画は次のとおりです。

ここに画像の説明を入力してください

そして、これがISNULLバージョンの計画です-それがどれほど単純であるかに注意してください(そしてスキャンは一度だけ行われることに注意してください):

ここに画像の説明を入力してください

COALESCEの場合、スキャンは2回行われます。つまり、結果が得られない場合でも、サブクエリは2回評価されます。サブクエリが0行を生成するようにWHERE句を追加すると、同様の不一致が見られます。プランの形状は変わる可能性がありますが、それでもダブルシーク+ルックアップまたはCOALESCEケースのスキャンが表示されます。少し異なる例を次に示します。

SELECT COALESCE((SELECT TOP (1) name FROM sys.objects 
    WHERE name = N'no way this exists'), N'foo');

SELECT ISNULL((SELECT TOP (1) name FROM sys.objects 
    WHERE name = N'no way this exists'), N'foo');

今回のCOALESCEバージョンの計画-ここでも、サブクエリを逐語的に繰り返すブランチ全体を見ることができます。

ここに画像の説明を入力してください

また、ISNULLを使用して、作業の約半分を実行する、はるかに単純な計画です。

ここに画像の説明を入力してください

さらに議論するために、dba.seでこの質問を見ることができます:

私の提案はこれです(そしてあなたは私の理由をヒントと上記の質問で見ることができます):信頼するが検証する。私は常にCOALESCEを使用します(これはANSI標準であり、3つ以上の引数をサポートし、データ型の優先順位ではそれほど奇妙なことをしないためです)。ただし、式の1つとしてサブクエリを使用していることがわかっている場合を除きます(これは使用しません)。このような理論的な作業以外で行ったことを思い出してください)、または実際のパフォーマンスの問題が発生していて、COALESCEとISNULLに実質的なパフォーマンスの違いがあるかどうかを比較したいと思います(サブクエリの場合以外では、まだ見つけていません)。私はほとんどの場合、同じようなデータ型の引数でCOALESCEを使用しているので、過去にそれについて言ったことを振り返る以外にテストを行う必要はほとんどありません(私はxQbertが指摘したaspfaqの記事、7年前)。

于 2012-05-19T23:42:39.567 に答える
1

ユーモアを始める: 1 つ目、2 つ目は機能しません。綴りが間違っています :D END ユーモア

---レスポンスをクリーンアップ---

isNull(値1,値2)の特徴

  • 1 つの評価のみをサポートします。最初の評価が null の場合、2 番目の評価が使用されるため、その評価も null の場合は null が返されます!
  • 非 ANSI 標準です。データベースの移植性が問題になる場合は、これを使用しないでください
  • isnull(value1,value2) は、Value1 のデータ型を返します
  • 選択した値のデータ型を返し、暗黙的な変換が発生しない場合は失敗します

Coalesce の機能 (Value1、Value2、Value3、Value...)

  • Null の複数の評価をサポートします。基本的に、リストから最初のnull以外の値を取得します。リスト内のすべての値が null の場合、null が返されます。
  • データベースの移植性が問題にならないことを意味するANSI標準です。
  • 選択した値のデータ型を返しますが、選択したすべてのフィールドが同じデータ型を返さない場合は失敗します。

したがって、質問に直接答えるには: SQL を開発する必要があるかどうかは状況によって異なります。

  • DBに依存しません。合体はより正確に使用できます。
  • 複数の評価が可能です。合体はより正確です(もちろん、 isnull を何度も何度も埋め込むことができます...)が、それをパフォーマンスの顕微鏡下に置くと、合体が勝つかもしれません。(私はそれをテストしていません)
  • isNull をサポートする db エンジンを使用していますか? (合体を使用しない場合)
  • 型キャストをどのように処理しますか? 暗黙的かどうか。

---ORIGINAL------ は null であり、2 つの評価のみをサポートします

合体はさらに多くをサポートしています... 合体 (columnName1, ColumnName2, ColumnName3, '')

合体はケース評価のデータ型と同様のデータ型を返しますが、isnull はリストの最初のデータ型を返します。(これは興味深いと思いました!)

いつ、どれを使うかについて。SQL 2008 と 2005 の両方で、異なるバージョン、異なるエンジン、異なる実行方法の実行計画を調べて調査する必要があります。

さらに、coalesce は ansii 標準、isnull はエンジン固有です。したがって、dbengine 間の移植性を高めたい場合は、coalesce を使用してください。

詳細についてはこちら aspfaq またはこちら msdn ブログ

于 2012-05-19T19:19:25.627 に答える
0

これを考慮に入れることができます。

  1. ISNULL関数には、チェックする値と null 値の置換の 2 つのパラメーターが必要でした

    2. COALESCE関数の動作は少し異なります。 COALESCEは任意の数のパラメータを取り、最初の非NULL値を返します。私はISNULLよりもCOALESCE を好みます。ANSI標準に準拠しているからです。ISNULLそうではありません。

    あなたの質問に対する答えが見つかったことを願っています。

于 2012-05-20T00:09:40.933 に答える