2015.04.23
Ted Holt 著

複雑な行選択を単純化する行値式

非常に長く、ごちゃごちゃしていて、難読で読みづらい、分別ある人が誰彼かまわず罵り、唾を吐くような 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)

それで、何千という取引を取得します。その取引のいくつかを以下に表します。

技術情報01

しかしあなたは初心者ではないので、このように照会を単純化できるでしょう。

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 )

これで正しい結果が得られます。

技術情報02

しかし、重宝した 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 キーワードはオンザフライで表を作成するメカニズムだと考えてください。

ページトップ

ボタン