7

サブクエリで一致しない結果を返す必要があるクエリがあります。サブクエリは空の結果を返す可能性があるため、サブクエリが空のセットを返す場合はデフォルト値(たとえば0)を設定して、IN (NULL)常に別のNULLが返されるのを防ぐ必要があります。

例えば

SELECT * FROM example_table WHERE id NOT IN (subquery_that_selects_ids)

subquery_that_selects_ids整数のセット、つまり(1,2,5,6)を返すか、サブクエリで一致する結果が見つからない場合は空のセットを返すことができます。

COALESCEサブクエリは複数の結果を返す可能性があるため、ここでは機能しません。

ソリューションはSQLiteまたはpostgresqlで機能する必要があります。サブクエリが空のセットを返さないようにするにはどうすればよいですか?


クエリは記述どおりに機能するはずだと誰もが言っています。そして、あなたはすべて正しいです。クエリはRails3のARELによって作成されています。ここに完全なクエリを投稿しようとしたときに、配列条件を使用しているときにARELが空のセットにNULLを入力していることに気付きました。

IE Railsでの私のクエリは次のようになりました:

Object.where("id NOT IN (?)", Object.where(other_conditions).select(:id))

に置き換えられていたとObject.where(other_conditions)評価され[]たとき?NULL

そこで、クエリを次のように書き直します。

Object.where("id NOT IN (" + Object.where(other_conditions).select(:id).to_sql + ")")

問題が解決しました。

私は@MichaelBuenの功績を認めていますが、クエリが正しいので、クエリが記述どおりに機能すると言った人にも賛成票を投じています。特に@OMGPoniesと@TedElliottに感謝します!

4

5 に答える 5

5

試す:

SELECT * FROM example_table 
WHERE id NOT 
    IN (select x.id from subquery_that_selects_ids as x where x.id is not null)

少し複雑にしていると思います。サブクエリに行がなくても、NOT IN には行があります。クエリは変更なしで機能します。とにかく、条件が満たされていない場合でもサブクエリで行を生成したい場合は、 UNION を使用してください

SELECT * FROM example_table 
WHERE id NOT 
    IN (select x.id from subquery_that_selects_ids as x 
        where 1 = 0 -- empty set
        union
        select 0)

とにかくUNIONは重複を排除し、UNION ALLは重複を保持します

于 2010-12-20T03:38:46.167 に答える
2

あなたは何かを混乱させていると思います。投稿したクエリsubquery_that_selects_idsは、空のセットを返す場合に問題なく機能します (そのため、すべての行example_tableが選択されます)。ここには、暗黙の null 値は含まれていません。

サブクエリがスカラーとして使用される状況を考えているかもしれません。その場合、サブクエリが行を返さない場合、結果の値は null です。

SELECT * FROM example_table WHERE id = (SELECT id FROM other_table WHERE name = 'foo')
于 2010-12-20T22:20:09.603 に答える
2

どうですか:

SELECT ex.ID, ex.OtherFields
FROM ExampleTable ex left join (Select ID from SomeOtherTable) o on o.ID = ex.ID
WHERE o.ID is null
于 2010-12-20T03:33:15.147 に答える
0

なぜこれがうまくいかないのですか?

SELECT *
  FROM example_table
 WHERE id IN (
    SELECT COALESCE(id, 0)
      FROM another_example_table
);
于 2010-12-20T03:09:56.520 に答える
0

複数値のサブクエリでは、NOT in 演算子を使用し、サブクエリによって返されたセットに NULL 値が含まれている場合に問題が発生します。サブクエリが空のセットである場合、それはそれが null を返したことを意味しません;)

null 値が含まれている場合、値が UNKNOWN にあるか、NOT IN Unknown にあるかを判断できないため、外側のクエリは空のセットを 1 つ返すように強制されます。

hr.employees テーブルを使用した例を次に示します。

*SELECT last_name FROM hr.employees WHERE Commission_pct NOT IN (0.1,0.35);*

このクエリは 26 行を返します。

*SELECT last_name FROM hr.employees WHERE Commission_pct NOT IN (0.1,0.35,NULL);*

NOT IN に渡されたリストの NULL がそれを台無しにするため、このクエリは行を返しません。したがって、サブクエリが null 値を返す可能性がある場合は、サブクエリの関数 (NVL、NVL2、COALESCE) で処理する必要があります。

これが役に立ったことを願っています。

ありがとう

アレクサンダー・ブファロ

于 2014-03-07T00:57:21.107 に答える