0

これをselectステートメントのフィールドの1つとして持っています:

select
      ...some fields
            (select ISNULL( TagNames, '') from  TagNames_CTE as tagNames 
         where  Content.ID = tagNames.EntryID) as tags 
from  SomeTable

ISNULL を使用していて、それらを空の文字列に置き換えるように指示している場合でも、一部のレコードで NULL が返されることに気付きました。それらを空の文字列に置き換えていないので、理由がわかりません。

4

2 に答える 2

1

行が見つからない場合、副選択は実際にはNULLを返すことがわかると思います。

句が起動してNULLである行が見つかった場合、その行はTagNames_CTE関数によって変換さます。whereTagNames''

ただし、行がまったく見つからない場合、関数は呼び出されず(魔法をかける行がないため)、全体的な副選択の結果はNULLになります。これは、その列に外部の何かを返す必要があるためです。選択する。

確認する簡単な方法は、サブクエリを(なしで)単独で実行し、行を含むかまったく含まない行ISNULL()を返すかどうかを確認することです。次の行に沿っていくつかの簡単なクエリを試してください。NULL

select 1,
       (select isnull (null,2) from dummytable where 1 = 0)
from dummytable

と:

select 1,
       (select isnull (null,2) from dummytable where 1 = 1)
from dummytable

1, null前者があなたに与え、後者があなたに与えることをおそらくあなたは見つけるでしょう1,2。次のステートメントを使用してMySQLでテストしたところ、これがおそらく正しいことがわかります。

> create table xyzzy (plugh integer);

> insert into xyzzy values (42):

> select 1,(select ifnull (null, 2) from xyzzy where 1 = 0) from xyzzy;
1 NULL

> select 1,(select ifnull (null, 2) from xyzzy where 1 = 1) from xyzzy;
1 2
于 2013-01-18T06:58:57.887 に答える
1

サブクエリ内では、実際に行に存在するISNULLa のみに影響を与える可能性があるためです。NULL実際に対処する必要があるのは、サブクエリが行を返さない場合だと思います。

select
      ...some fields
            ISNULL((select  TagNames from  TagNames_CTE as tagNames 
         where  Content.ID = tagNames.EntryID), '') as tags 
from  SomeTable

したがって、サブクエリの外側に移動します。(私は通常、以上をお勧めCOALESCEISNULLます。これは標準 SQL であり、複数のパラメーターをサポートし、型強制は理にかなっています)

于 2013-01-18T07:18:26.547 に答える