如何在SQL Server中的case语句中使用多个值

时间:2012-06-22 06:20:29

标签: sql sql-server-2008

考虑以下

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子句?

这只是为了知识。

由于

2 个答案:

答案 0 :(得分: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版本。

答案 1 :(得分:0)

使用CASE吗?这也应该有效:

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

虽然我必须说我最喜欢@Dems's suggestion about using a join。请注意,您可以使用内联表而不是表变量,从而使整个事件成为单个查询:

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