3

の違いを提案してください:

1)WHERE student.name = ISNULL(@name, student.name)

2)WHERE (student.name = @name OR @name IS NULL)

実際、最初の方法を使用したときに一部のレコードがスキップされるという問題のバグが自分の名前に対して割り当てられていました。しかし、たとえば2に置き換えたときに修正されました。

4

6 に答える 6

8

2番目のパラメーター置換値ISNULL()です。これは、最初のパラメーターがnullの場合に置換される値を意味します。したがって、とが両方だった場合、基本的に次のように記述します。@namestudent.namenull

student.name = NULL

これはfalseに相当します(nullSQLの場合は不明と見なされ、何にも等しくなりません)。

2番目の例では、IS演算子を使用してnull値をテストしています。null値はnullのtrue場合に返さ@nameれます。

于 2012-10-19T15:29:52.513 に答える
1

2番目のステートメントは、学生の名前が@nameと一致する場合、または名前が指定されていない場合にレコードを選択することを示しています。@ nameが指定されている場合は、その名前を選択します。@nameが空の場合は、すべてのレコードを選択します。@nameがNULLの場合、これはテーブル内の値を気にしません

最初のステートメントでは、@ nameがNULLの場合、現在の行のstudent.nameと同じstudent.nameを使用します。

@nameとstudent.nameの両方がNULLの場合

WHERE student.name = @name OR @name IS NULL -- the other part of the OR is true so records will be returned

WHERE student.name = ISNULL(@name, student.name) becomes WHERE NULL = NULL

NULL = NULLfalseを返すため、その行のレコードは返されません

于 2012-10-19T15:29:25.483 に答える
1
WHERE student.name = ISNULL(@name, student.name)

WHERE (student.name = @name OR @name IS NULL)

student.nameがnullの場合を除いて、同等です。

WHERE (student.name = @name OR @name IS NULL)

簡略化される可能性があります:

WHERE COALESCE(student.name,'nul') = COALESCE(@name, student.name,'nul')

WHERE student.name = ISNULL(@name, student.name)

と同等です

WHERE (student.name = @name OR @name IS NULL AND student.name IS NOT NULL)
于 2012-10-19T15:30:36.453 に答える
1

これが違いです

name |student.name  |first_result  |second_result |expected*
A    |A             |true          |true          |true
A    |B             |false         |false         |false
null |A             |true          |true          |true
A    |null          |false         |false         |false
null |null          |FALSE         |TRUE          |TRUE

*期待される-一部の人々によって期待されますが、私たちの宇宙では正しくありません。

ご覧のとおり、両方の値がNULLの場合、最初のWHEREはnull = null(FALSE)と評価されるため、違いが生じます。

これは、SQLServerで次のように確認できます。

select case when null = null then 1 else 0 end

これはあなたに0を与えます。

于 2012-10-19T15:32:10.790 に答える
0

ANSI_NULLSシステム設定を別の方法で設定している場合、null = anythingはfalseです。

student.nameしたがって、最初のクエリは、nullであっても、nullのエントリを返しません。これは、student.nameがnullのエントリに対して@name比較が評価され、 falseが返されるためです。where null=nullnull=null

于 2012-10-19T15:27:34.813 に答える
0

以下の例を確認してください。2番目のオプションでは、name=@nameを確認する前に@nameがnullであることを確認できます。

declare @name varchar(10) = null
declare @table table (name varchar(10))

insert into @table 
select 'A'
UNION
SELECT null


---returns only A because null = column is always false
select * from @table where name = ISNULL(@name, name)

--returns all rows
select * from @table where (@name is null or name = @name)


set @name = 'A'
select * from @table where name = ISNULL(@name, name)
select * from @table where (@name is null or name = @name)
于 2012-10-19T15:33:25.733 に答える