7

nullの使用について質問があります。

このクエリを実行すると

SELECT SUM(x)
FROM (SELECT NULL AS x) AS DerivedTable

エラーメッセージが表示されます

「オペランドデータ型void型はsum演算子には無効です。」

ただし、null許容フィールドを使用してテーブルを作成し、それを合計集計内で使用すると、NULL値は無視され、基本的に残りのすべてのレコードが合計されます。

CREATE TABLE #temp1(x int)
insert into #temp values (NULL),(3),(5)

SELECT SUM(x) FROM #temp1 

結果は8です。

これの論理的な説明はありますか?NULLのデータ型が、派生テーブルを使用したクエリで宣言されていないが、一時テーブルを使用して宣言されているためでしょうか。また、2番目の#temp1の例のように、テーブルまたは派生テーブルから実行したときにこのエラーメッセージを生成する方法があるかどうかを本当に知りたいです。テーブルまたはテーブル式から実行したときにこのエラーメッセージが表示される例は、大歓迎です。

皆さん、ありがとうございました

4

1 に答える 1

15

これは、派生テーブルのシナリオ では列の型を推測できないためです。

ステートメントを変更し、列で明示的に型を使用すると、選択が機能します。

SELECT SUM(x) FROM (SELECT CAST(NULL AS INTEGER) AS x) AS DerivedTable

型を推測できる次のステートメントと同様に

SELECT SUM(x) FROM (SELECT NULL AS x UNION SELECT 1) AS DerivedTable

SQL フィドル


これは、2番目の質問にも答えます。型を宣言せずにテーブルを作成することはできないため、その特定のエラー メッセージを生成するステートメントを生成する方法はありません。

于 2013-03-11T06:04:52.357 に答える