2011-08-10 9 views
9

T-SQLの順位付け関数を使用する場合、ランキング値を含む列はNULLにできます。結果セットのビューを作成するときは、これを見ることができますT-SQLランキングの値がnullの列を返すのはなぜですか?

:このビューのsp_helpを実行

CREATE VIEW v 
AS 
    SELECT Name 
    , ListPrice 
    , RANK() OVER (ORDER BY ListPrice DESC) AS [Rank] 
    , DENSE_RANK() OVER (ORDER BY ListPrice DESC) AS [DenseRank] 
    , ROW_NUMBER() OVER (ORDER BY ListPrice DESC) AS [RowNumber] 
FROM Production.Product 

はランキング関数を使用して列がNULL可能であることを示している:

条件が引き起こす
EXEC sp_help 'v' 

Column_name (...) | Nullable 
---------------...-+------------+ 
...   (...) | ... 
Rank   (...) | Yes 
DenseRank  (...) | Yes 
RowNumber  (...) | Yes 

ランク付け関数はNULLを返しますか?

+1

ビュー内のAFAIK計算カラムは、実表の計算カラムとは異なる扱いを受けません。 [それについてのいくつかのコメントと空白の可能性については、このページの最後にあります。](http://msdn.microsoft.com/en-us/library/ms191250.aspx) –

答えて

8

ビュー内のすべての計算/関数ベースの列は、NULL可能であるようです。例えば:

create view v1 
as 
    select OBJECT_ID,OBJECT_ID * 1 as obj2 from sys.objects 
go 
EXEC sp_help 'v1' 

object_idがNULL可能ではありませんが、そのobj2はそれがあればobject_idがnullになることはありませんことを自明の観察可能だにもかかわらず、である、またできobj2ことを示します。 NULL可能ではないように見えるために列を強制的に(これはあなたが本当に探しているものであるかどうかわからない)の私が知っている

唯一の方法は、ISNULLでそれをラップすることです:

create view v2 
as 
    select OBJECT_ID,ISNULL(OBJECT_ID * 1,0) as obj2 from sys.objects 
go 
EXEC sp_help 'v2' 

興味深いことに、これはあなたがCOALESCE代わりのISNULLを使用することはできませんいくつかの場所の一つである:

create view v3 
as 
    select OBJECT_ID,COALESCE(OBJECT_ID * 1,0) as obj2 from sys.objects 
go 
EXEC sp_help 'v3' 

v3v1に似ています。

関連する問題