次の表 (スナップショット) を検討してください。
テーブルから行を選択するクエリを書きたいと思います。
- 7 つの列値 (VAL、EQ、EFF、...、SY) のうち少なくとも 4 つが NULL ではありません。
それを行う方法はありますか?
次の表 (スナップショット) を検討してください。
テーブルから行を選択するクエリを書きたいと思います。
それを行う方法はありますか?
行ごとに非 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
。
これはどう?列を「行」に変換し、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
ます。
値は数値であるか、これにNULL
使用できるISNUMERIC()
ため:
SELECT *
FROM YourTable
WHERE ISNUMERIC(VAL)+ISNUMERIC(EQ)+ISNUMERIC(EFF)+ISNUMERIC(SIZE)
+ISNUMERIC(FSCR)+ISNUMERIC(MSCR)+ISNUMERIC(SY) >= 4