WHERE句でCASE文

私は主にSQLServerを使用していますが、プロシージャ等で条件によってWHERE句を変えたいときがあります。

CREATE PROCEDURE prTest
	@KBN INT,
	@CODE INT
AS
BEGIN
	IF @KBN = 1
	BEGIN
		SELECT ID FROM TEMP WHERE ACODE = @CODE
	END
	ELSE
	BEGIN
		SELECT ID FROM TEMP WHERE BCODE = @CODE
	END
END

こんな感じで書いていました。
これはまだ短いのでいいですが、膨大な列を取得する場合など、WHERE句がちょっと違うだけでかなり長いプロシージャになってメンテも大変でした。
そんなときに発見したのがWHERE句でCASE文を使うやり方です。
上のプロシージャはこんな風に書けます。

CREATE PROCEDURE prTest
	@KBN INT,
	@CODE INT
AS
BEGIN
	SELECT ID FROM TEMP WHERE CASE WHEN @KBN = 1 THEN ACODE ELSE BCODE END = @CODE
END

1行になりました。
WHERE句のCASE文で@KBNの値によって条件とするフィールドを切り替えています。

業務システム開発では請求先での集計や店舗での集計等、グループ化するコードが違うだけで納品数や納品額、粗利等、他の項目は同じ場合が多いです。
そんなときに使えるWHERE句でのCASE分です。
ORACLEでも使えると思います。

応用するとこんなことも可能です。

CREATE PROCEDURE prTest
	@KBN INT,
	@CODE INT,
	@CODE2 INT
AS
BEGIN
	SELECT ID FROM TEMP WHERE CASE WHEN @KBN = 1 THEN ACODE ELSE BCODE END = CASE WHEN @KBN = 1 THEN @CODE ELSE @CODE2 END
END


スポンサーサイト
アフィリエイトはエーハチネット
ドメイン取るならお名前.com

コメントを残す

メールアドレスが公開されることはありません。