我有sql结果,看起来像这样
ID | ERROR_1 | ERROR_2
1 | '1' | '2'
2 | null | '2'
3 | '1' | '2'
4 | '1' | null
我希望将每个ERROR_X
行拆分为以下结果:
ID | ERROR
1 | '1'
1 | '2'
2 | '2'
3 | '1'
3 | '2'
4 | '1'
有可能吗?如果是,我该怎么做?
查询与此类似:
SELECT h.id as ID,
CASE WHEN h.floor=1 THEN '1' END as ERROR_1,
CASE WHEN w.color='blue' THEN '2' END as ERROR_2,
FROM home h
LEFT JOIN window w ON w.id=h.window_id;
目前我使用UNIONS但这个查询的成本很高(每个查询都需要从表中选择ID为string类型的数据,进行一些连接和过滤数据)。我想尝试仅使用字符串id查询主表一次。
答案 0 :(得分:2)
您可以将您的选择查询放入WITH子句并取消忽略此数据。
WITH VDATA AS (
SELECT
h.id as ID,
CASE WHEN h.floor=1 THEN '1' END as ERROR_1,
CASE WHEN w.color='blue' THEN '2' END as ERROR_2
FROM home h
LEFT JOIN window w ON w.id=h.window_id
) SELECT
ID,
ERROR
FROM VDATA
UNPIVOT (error for errorid in (ERROR_1 as '1', ERROR_2 as '2'));
答案 1 :(得分:0)
好像你需要使用union all
:
SELECT id, CASE WHEN floor=1 THEN '1' END AS error
FROM home
UNION ALL
SELECT window.id, CASE WHEN window.color='blue' THEN '2' END
FROM window
JOIN home ON window.id = home.window_id