0

以下を検討してください

Declare @t table(Val int, name varchar(100))
Insert into @t select 1,'name1' 
union all select 1,'name2' 
union all select 2,'name3'
union all select 3,'name4'

Val 1 または 2 に関連するレコードを取得したい場合は、IN 句を選択します。ただし、値を選択する必要がある条件があります。今後は以下のようにCASEアプローチを進めていきます

declare @type int  = 1
select *
from @t 
where val  = case when @type =1 then 1  end or
      val  = case when @type =1 then 2
             end

select * from @t where val in (1,2)として正常に動作します(実行時に値を決定する必要があり、動的クエリを使用していないため、これを使用することはできません)。IN 句をシミュレートする他の方法はありますか?

これは単なる知識のためです。

ありがとう

4

2 に答える 2

1

コードが単一の値をパラメーターとして取り、その値が値のリストに関連していると仮定すると、マッピング テーブルを使用できます...

CREATE PROCEDURE pseudo_in_clause (@type INT)
AS

DECLARE @map TABLE (
  type  INT,
  val   INT,
  PRIMARY KEY (type, val)
)

INSERT INTO @map (type, val) VALUES (1, 1),
                                    (1, 2),
                                    (2, 3)

SELECT
  *
FROM
  yourTable      AS data
INNER JOIN
  @map           AS map
    ON data.val = map.val
WHERE
  map.type = @type

マップは、永続テーブル、上記のような一時テーブル、関数などである可能性があります。

または、CASE ステートメントで IN 句を使用することもできます...

SELECT
  *
FROM
  yourTable      AS data
WHERE
  CASE WHEN @type = 1 AND data.val IN (1,2) THEN 1
       WHEN @type = 2 AND data.val IN (3,4) THEN 1
                                            ELSE 0
  END = 1

個人的にはJOINバージョンの方が好きです。

于 2012-06-22T06:43:47.540 に答える
0

使用する必要がありCASEますか? これもうまくいくはずです:

…
WHERE @type = 1 AND data.val IN (1, 2)
   OR @type = … AND data.val IN (…)
   OR …

何よりも、結合の使用に関する@Demsの提案が好きだと言わざるを得ません。テーブル変数の代わりにインライン テーブルを使用して、全体を 1 つのクエリにすることができることに注意してください。

SELECT *
FROM yourTable AS data
  INNER JOIN (
    VALUES
      (1, 1),
      (1, 2),
      (2, 3)
  ) AS map ON data.val = map.val
WHERE map.type = @type
于 2012-06-22T11:32:00.510 に答える