2

次の表 (スナップショット) を検討してください。

ここに画像の説明を入力

テーブルから行を選択するクエリを書きたいと思います。

  • 7 つの列値 (VAL、EQ、EFF、...、SY) のうち少なくとも 4 つが NULL ではありません。

それを行う方法はありますか?

4

3 に答える 3

5

行ごとに非 null の数を数えるだけです。

SELECT *
FROM Table1
WHERE
  IIF(VAL IS NULL, 0, 1) +
  IIF(EQ IS NULL, 0, 1) + 
  IIF(EFF IS NULL, 0, 1) + 
  IIF(SIZE IS NULL, 0, 1) + 
  IIF(FSCR IS NULL, 0, 1) +
  IIF(MSCR IS NULL, 0, 1) + 
  IIF(SY IS NULL, 0, 1) >= 4

sql-server-2005 にタグを付けたことに気付きました。IIFは sql server 2012 ですが、 に置き換えることができますCASE WHEN VAL IS NULL THEN 1 ELSE 0 END

于 2013-09-27T19:38:09.523 に答える
2

これはどう?列を「行」に変換し、SQL を使用して null 以外をカウントします。

select *
from Table1 as t
where
    (
        select count(*) from (values
           (t.VAL), (t.EQ), (t.EFF), (t.SIZE), (t.FSCR), (t.MSCR), (t.SY)
        ) as a(val) where a.val is not null
    ) >= 4

このソリューションが気に入っているのは、データ処理からデータを分割しているためです。この派生した「値を含むテーブル」を取得した後は、それに何かを行うことができ、将来ロジックを簡単に変更できます。合計、カウント、任意の集計を行うことができます。case when t.VAL then ... end + ...,ロジックを何度も変更する必要があるよりも、それが好きだった場合。

たとえば、2 より大きいすべての非 null 要素を合計するとします。このソリューションでは、 に変更countし、節をsum追加するだけで完了です。whereだった場合はiif(Val is null, 0, 1) +、まずこれをどうするかを考えてから、すべての項目をたとえば に変更する必要がありcase when Val > 2 then Val else 0 endます。

sql fiddle demo

于 2013-09-27T19:59:28.220 に答える
1

値は数値であるか、これにNULL使用できるISNUMERIC()ため:

SELECT *
FROM YourTable
WHERE ISNUMERIC(VAL)+ISNUMERIC(EQ)+ISNUMERIC(EFF)+ISNUMERIC(SIZE)
     +ISNUMERIC(FSCR)+ISNUMERIC(MSCR)+ISNUMERIC(SY) >= 4
于 2013-09-27T19:45:00.467 に答える