2013-02-25 11 views
5

私は0値のために20の異なる列をチェックする必要があるという質問があります。 またはOracle SQLの短縮形ですか?

よりもむしろやって:

BOOK <> 0 OR ALLO <> 0 OR ...

がそれを行うための迅速な方法はありますか? あなたが使用することができます(BOOK、ALLO、...)<> 0

+1

私は思うSQL Serverはあなたがすることができます '0 <> ANY(BOOK UNION SELECT ALLO SELECTを選択...) '。あなたが一緒に欲しいもの全てを 'UNION 'から取り出すのではなく、それを見つけるためにサブクエリを使うことで、力が得られます。 Oracleにはおそらく同等の機能があります。 –

+3

あなたがすばやく言うとき、あなたはそれらの列すべてを入力したくないということを意味するだけですか?それは...非常に奇妙なことです。一度入力すれば、永遠に動作します。 –

+0

全く単純... no – SQLMason

答えて

5

それは(MySQLの、SQL-Serverの、Postgresの)どこにも実行されず、それはおそらくSQL標準ではないですが、それは、Oracleで動作します。

SQL-Fiddle


でテスト
WHERE 0 <> ANY (BOOK, ALLO, ...) 

標準であり、MySQLとPostgresでは動作しますが、Oracleでは動作しない別の方法があります。

WHERE (0, 0, ...) <> (BOOK, ALLO, ...) 

とのPostgresで動作し、2012 SQL-Serverは(テーブル値コンストラクタを使用して)別の標準的な方法:

WHERE 0 <> ANY (VALUES (BOOK), (ALLO), ...) 
+0

これは素晴らしく、そのような機能が存在するかどうかは分かりませんでした。ありがとうございました。 – Lock

+0

'ANY'は' IN'のような演算子です。それは機能ではありません。 –

1

WHERE (book + allo + ...) > 0 
+2

彼らが負ではないと仮定して... –

+0

良い点。問題に応じて:-) – DCookie

+0

うん、ネガは可能です! – Lock

1

負の値が不可能な場合は、あなたがこれを行うことができます:

WHERE BOOK + ALLO + ... > 0 
よう 何か

負の値が可能な場合は、これを表現するために考えられる最も簡潔な方法です。

WHERE ABS(BOOK) + ABS(ALLO) + ... > 0 

また、これはデータベースに依存しません。

これらのソリューションは、null値が不可能な場合にのみ機能し、そうであればかなり乱雑です。

+0

次に、oracleでは 'abs(nvl(book、0))+ ...'を、SQLサーバでは 'isnull(..)'を使用できます。 – glh

関連する問題