の違いを提案してください:
1)WHERE student.name = ISNULL(@name, student.name)
と
2)WHERE (student.name = @name OR @name IS NULL)
実際、最初の方法を使用したときに一部のレコードがスキップされるという問題のバグが自分の名前に対して割り当てられていました。しかし、たとえば2に置き換えたときに修正されました。
の違いを提案してください:
1)WHERE student.name = ISNULL(@name, student.name)
と
2)WHERE (student.name = @name OR @name IS NULL)
実際、最初の方法を使用したときに一部のレコードがスキップされるという問題のバグが自分の名前に対して割り当てられていました。しかし、たとえば2に置き換えたときに修正されました。
の2番目のパラメーターは置換値ISNULL()
です。これは、最初のパラメーターがnullの場合に置換される値を意味します。したがって、とが両方だった場合、基本的に次のように記述します。@name
student.name
null
student.name = NULL
これはfalseに相当します(null
SQLの場合は不明と見なされ、何にも等しくなりません)。
2番目の例では、IS
演算子を使用してnull値をテストしています。null値はnullのtrue
場合に返さ@name
れます。
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 = NULL
falseを返すため、その行のレコードは返されません
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)
これが違いです
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を与えます。
ANSI_NULLSシステム設定を別の方法で設定している場合、null = anything
はfalseです。
student.name
したがって、最初のクエリは、nullであっても、nullのエントリを返しません。これは、student.nameがnullのエントリに対して@name
比較が評価され、 falseが返されるためです。where null=null
null=null
以下の例を確認してください。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)