-5

NULL を許可する列の文字データを比較するために MIN 関数を使用していましたが、悲惨な結果になりました。;-) 以下は、同じ種類のことを示す非常に単純化された例です。

  1. sys.indexes の行数を決定します。

    select count(*) from sys.indexes;
    
  2. 次の SQL を実行します。

    select count(name), substring(cast(min(name) as varbinary),1,1) 
      from sys.indexes;
    

    カウントが #1 に一致する場合は、ここで終了します。代わりに、(より多くのオブジェクトを含む) 別のデータベースを試してください。

  3. [メッセージ] タブに移動します。警告: Null 値は、集計またはその他の SET 操作によって削除されます。

  4. その警告を解決するために、「名前」列のヌルをどのように処理しますか? 合体で?

  5. 「name」を「coalesce(name,char(0x7e))」に置き換えて、SQL を実行します。

    select count(coalesce(name,char(0x7e))), 
      substring(cast(min(coalesce(name,char(0x7e))) as varbinary),1,1) 
      from sys.indexes;
    
  6. #5 の MIN 関数の結果に注意してください (0x63 ではなく 0x7e)。

質問:

A. #4 のように、合体は警告と欠落 (null) データを処理する適切な方法ですか?

B. #6 の結果は期待どおりではないため、SQL Server で文字データを比較する正しい方法は何ですか? すべてを varbinary に変換しますか?

[編集...]

以下の説明では、COALESCE による null 置換と比較の結果との関係について、混乱と議論がありました。この 2 つの関係は次のとおりです。文字列 (1 文字を含む) を null 置換プレースホルダーとして選択する場合 (上記の手順 4 と #5)、その文字列は、実行中の比較の期待される結果を満たす必要があります。クエリ内の他のデータの値に対して実行されます。一部の照合では、他の照合よりも適切な文字列を見つけるのが難しい場合があります。

4

2 に答える 2

0

ISNULL を次のように使用できない理由があると想定しています: ISNULL(MyField,'Some String I will know is a null')

ps、何をしているかに応じて、本番環境の大規模なデータセットでのこれのパフォーマンスに注意してください。

于 2013-05-23T16:22:06.727 に答える