如何根据多种条件选择列?

时间:2019-03-07 11:31:57

标签: mysql sql

我有一个包含多个price-timestamp元组的表:

#mytable;
id;<somecolumns>;price1;timestamp1;price2;timestamp2;

我想导出临时表中的每个价格-时间戳记元组,但仅导出其时间戳记在特定时间间隔内的价格:

#mytemp
id;price1;price2;

我可以通过为每个元组重复sql来实现此目的:

INSERT INTO mytemp (price1)
SELECT price1 FROM mytable WHERE timestamp1 > NOW() - INTERVAL 3 HOUR;

INSERT INTO mytemp (price2)
SELECT price2 FROM mytable WHERE timestamp2 > NOW() - INTERVAL 3 HOUR;

#repeat for all price-timestamp tuples

问题:我可以将此优化为一个单独的SQL查询吗?

4 个答案:

答案 0 :(得分:3)

您可以在以下情况下使用大小写

  SELECT
   sum(case when timestamp1 > NOW() - INTERVAL 3 HOUR then price1 else 0 end) as price1,
    sum(case when timestamp2 > NOW() - INTERVAL 3 HOUR then price2 else 0 end)
    as price2
     FROM mytable  ;

但是如果要插入,只需选择

INSERT INTO mytemp (price1,price2)
SELECT
   sum(case when timestamp1 > NOW() - INTERVAL 3 HOUR then price1 else 0 end) as price1,
    sum(case when timestamp2 > NOW() - INTERVAL 3 HOUR then price2 else 0 end)
    as price2
     FROM mytable

答案 1 :(得分:1)

使用4

case when

答案 2 :(得分:0)

尝试

SELECT price1 , '' as price2 from testa WHERE timestamp1 > NOW() - INTERVAL 3 HOUR
UNION
SELECT '' as price1, price2  as price from testa WHERE timestamp2 > NOW() - INTERVAL 3 HOUR

答案 3 :(得分:0)

您可以使用cross join取消显示数据:

select (case when n.n = 1 then price1
             when n.n = 2 then price2
        end),
       (case when n.n = 1 then timestamp1
             when n.n = 2 then timestamp2
        end)       
from t cross join
     (select 1 as n union all select 2) n
having timestamp > now() - interval 3 hour;

但是,如果您在union all上有索引,则您的方法或与timestamp等效的方法可能是最快的方法。