複雑な行選択を単純化する行値式
非常に長く、ごちゃごちゃしていて、難読で読みづらい、分別ある人が誰彼かまわず罵り、唾を吐くような SQL が好みなら、このヒントはあなたに向いていません。どうか、私のショップの仕事に応募しないでください。でも、SQL のデバッグより他にやることがあるだろうと考えているなら、単純ながら気の利いたテクニックをお教えします。
経理担当主任があなたのオフィスにやってきて、総勘定元帳の取引のスプレッドシートを要求していると考えてみてください。アカウント 120、135、180、192、198 の今月の取引内容を要求しています。初心者が照会を作成すると以下のようになります (ただし、あまりきれいにフォーマットしていないかもしれません)。
select * from glxacts
where date between '2015-02-01' and '2015-02-28'
and (account=120 or account=135 or account=180 or
account=192 or account=198)
それで、何千という取引を取得します。その取引のいくつかを以下に表します。
しかしあなたは初心者ではないので、このように照会を単純化できるでしょう。
select * from glxacts
where date between '2015-02-01' and '2015-02-28'
and account in (
120, 135, 180, 192, 198)
実に IN 演算子がコードをクリーンアップしました!
経理担当者はこの照会を洗練したいと考えています。彼は、ある部門のあるアカウントに焦点を絞ります。(単純にするために 3 つに絞ります。経理担当者はもっと知りたいと考えていることが前提です。)
- 部門 22 は、アカウント 180
- 部門 34 は、アカウント 135
- 部門 35、アカウント 198
このようにできます。
select * from glxacts
where date between '2015-02-01' and '2015-02-28'
and ( department = 22 and account = 180
or department = 34 and account = 135
or department = 46 and account = 198 )
これで正しい結果が得られます。
しかし、重宝した IN 演算子を醜い AND と OR の塊に置き換えたのは残念だと思いませんか?良い知らせがあります。2 つ以上のフィールドを比較する場合に、引き続き IN を使用できます。
select * from glxacts
where date between '2015-02-01' and '2015-02-28'
and (department, account) in
(values(22,180), (34,135), (46,198))
VALUES キーワードはオンザフライで表を作成するメカニズムだと考えてください。