使用集合代替桌子(或其他优雅的解决方案)
Posted
技术标签:
【中文标题】使用集合代替桌子(或其他优雅的解决方案)【英文标题】:Using a set in the place of a table (or another elegant solution) 【发布时间】:2014-07-22 23:06:00 【问题描述】:我回答了一个问题,我必须即时生成一个临时的derived table
(或使用实际表),请参阅:https://***.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
【问题讨论】:
【参考方案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
【讨论】:
以上是关于使用集合代替桌子(或其他优雅的解决方案)的主要内容,如果未能解决你的问题,请参考以下文章