愚者の経験

「また今度」はほとんどこない

[SQL]動的にin句を変化させるような時の代替案

ふと気づいた。

        select *
        from table1
        where id in(@param)

というような形で「@paramに動的な複数値をカンマ区切りで渡したい」と
いう要望は結構ある。しかしこの状態では期待した結果にならないので
executeやsp_executesql(動的SQL実行)を使う

        execute ('select * from table1 where id in('+@param+')')

これは期待通りの結果になるのだが、いかんせんAccessと相性が悪いため
(カラム名が解決できないのでコントロールソースが手入力になるなど)SQLCLRを使って
カンマ区切りをテーブルにして返す関数(Split)を作成すると良いと最初は思いました。

苦労してSQLCLRを調べたりしたんですがそんなことしなくてもできます。
もちろん動的実行しなくてもできます。こうすればよかったんです…。

        select *
        from table1
        where ','+@param+',' like '%,'+cast(id as varchar)+',%'

なんでもっと早く気づかなかった自分…orz
多分インデックスも効くんじゃないかな。

広告

[SQL]動的にin句を変化させるような時の代替案」への2件のフィードバック

  1. KOJIMA Shigeru 8月 29, 2014 11:43 am

    素晴らしい処理方法ですね~

    in句を使用して動的ストアドを書いていたら10秒もかかっていましたが、
    この方法だと、1秒で処理出来ました。
    本当に助かりました! ありがとうございます。 m(_W_)m
    KOJIMA Shigeru

    • rsskkr 8月 29, 2014 9:01 pm

      KOJIMA Shigeru様
      はじめましてrsskkrです。ブログにわざわざコメントを頂きありがとうございます。
      当初動的ストアド使用しないことを目標にこの方法を発見して処理速度はいわば副産物的な
      ものだったのですが、状況にもよるでしょうが10倍速とは驚きです。

      実際の使用感は次回のプログラミングの参考になりますのでとても嬉しく思います。
      拙い内容のブログですが、お役に立てて幸いです。
      また偶に更新していきますのでよろしくお願い致します。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。