代码之家  ›  专栏  ›  技术社区  ›  Ivan-Mark Debono

如何将联合改为in子句?

  •  5
  • Ivan-Mark Debono  · 技术社区  · 6 年前

    我需要从同一个表中获取最多3个不同的记录,因此目前我正在执行以下操作:

    SELECT 1, mycolumn FROM mytable WHERE id = @firstId
    UNION ALL
    SELECT 2, mycolumn FROM mytable WHERE id = @secondId
    UNION ALL
    SELECT 3, mycolumn FROM mytable WHERE id = @thirdId
    

    实际 SELECT 部分包含20多个列和 FROM 零件包含多个 JOINs . 第一列是一个常量,并且根据记录始终是固定的。我不知道会有多少条记录可以返回。它可以是0到3个记录。

    是否可以更改上述查询以便使用 IN 这样地:

    SELECT ???, mycolumn FROM mytable WHERE id IN (@firstId, @secondId, @thirdId)
    

    但是如果我使用 ?

    3 回复  |  直到 6 年前
        1
  •  5
  •   Tim Biegeleisen    6 年前

    您可以使用 CASE 此处表达式只包含一个查询:

    SELECT
        CASE id WHEN @firstId  THEN 1
                WHEN @secondId THEN 2
                WHEN @thirdId  THEN 3 END AS val,
        mycolumn
    FROM mytable
    WHERE
        id IN (@firstId, @secondId, @thirdId);
    

    如果还希望按计算列排序,则添加 ORDER BY val 到上述查询的结尾。

        2
  •  3
  •   PSK    6 年前

    你可以使用 CASE 喜欢跟随。

    SELECT 
           CASE 
                  WHEN id= @firstId THEN 1 
                  WHEN id=@secondId THEN 2 
                  ELSE 3 
           END AS rn, 
           mycolumn 
    FROM   mytable 
    WHERE  id IN (@firstId, 
                  @secondId, 
                  @thirdId)
    

    另一种方法是 DENSE_RANK 如果您对每个提供的ID和@firstID都有一条记录,@secondID&thirdid按升序排列。

    SELECT DENSE_RANK() 
             OVER( 
               ORDER BY id) rn, 
           mycolumn 
    FROM   mytable 
    WHERE  id IN ( @firstId, @secondId, @thirdId ) 
    
        3
  •  1
  •   Gordon Linoff    6 年前

    为此,我建议使用表值构造函数:

    select v.outputnum, my_column
    from mytable t join
         (values (@firstid, 1),
                 (@secondid, 2),
                 (@thirdid, 3)
         ) v(id, outputnum)
         on t.id = v.id
    order by v.outputnum;
    

    我认为这比其他版本更简单,因为ID列表只在查询中出现一次——所以查询的不同部分不存在不同步的危险。

    推荐文章