【问题标题】:Using a set in the place of a table (or another elegant solution)使用集合代替桌子(或其他优雅的解决方案)
【发布时间】:2014-07-22 23:06:00
【问题描述】:

我回答了一个问题,我必须即时生成一个临时的derived table(或使用实际表),请参阅:https://stackoverflow.com/a/24890815/1688441

而不是使用下面的派生表(使用 select 和 union):

  (SELECT 21 AS id UNION SELECT 22) AS tmp

在:

SELECT GROUP_CONCAT(CASE WHEN COLUMN1 IS NULL THEN "NULL" ELSE COLUMN1 END)
FROM archive
RIGHT OUTER JOIN
  (SELECT 21 AS id UNION SELECT 22) AS tmp ON tmp.id=archive.column2;

我更希望能够使用更优雅的东西,例如:

  ([[21],[22]]) AS tmp

在任何 SQL 数据库或任何类似功能中是否有任何此类表示法?有没有一种简单的方法可以使用set 代替from 中的table(当我说set 时,我的意思是一维的值列表),就像我们使用IN 一样。

因此,使用这种表示法,具有 1 个 int 列和 1 个具有 2 行的字符串列的临时表将具有:

([[21,'text here'],[22,'text here2']]) AS tmp

【问题讨论】:

    标签: sql temporary-objects


    【解决方案1】:

    SQL Server 允许这种语法:

    SELECT A, B, C,
     CASE WHEN D < 21 THEN ' 0-20'
          WHEN D < 51 THEN '21-50'
          WHEN D < 101 THEN '51-100'
          ELSE '>101' END AS E
     ,COUNT(*) as "Count"
     FROM  (
        values ('CAR', 1,2,22)
              ,('CAR', 1,2,23)
              ,('BIKE',1,3,2)
    )TABLE_X(A,B,C,D)
    
    GROUP BY A, B, C, 
     CASE WHEN D < 21 THEN ' 0-20'
          WHEN D < 51 THEN '21-50'
          WHEN D < 101 THEN '51-100'
          ELSE '>101' END
    

    产生这个:

    A    B           C           E      Count
    ---- ----------- ----------- ------ -----------
    BIKE 1           3            0-20  1
    CAR  1           2           21-50  2
    

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2014-03-22
      相关资源
      最近更新 更多