将单行展开为多行

时间:2014-10-06 06:21:49

标签: sql sqlite android-sqlite

以下是两列表的示例,我使用Bitwise Operators来存储日期。

-- +---------+------+
-- | Title   | Days |
-- +---------+------+
-- | Title 1 | 127  |
-- | Title 2 |  12  |
-- | Title 3 |   8  |
-- | Title 4 |  36  |
-- +---------+------+

我想要的是进行查询并展开每一行,因此会根据天数重复查询,每行只包含一天。

-- +---------+------+
-- | Title   | Days |
-- +---------+------+
-- | Title 1 |   1  |
-- | Title 1 |   2  |
-- | Title 1 |   4  |
-- | Title 2 |   4  |
-- | Title 4 |   4  |
-- | Title 1 |   8  |
-- | Title 2 |   8  |
-- | Title 3 |   8  |
-- | Title 1 |  16  |
-- | Title 1 |  32  |
-- | Title 4 |  32  |
-- | Title 1 |  64  |
-- +---------+------+

通过让应用程序多次查询数据库以检索每天的行,我已经有了解决方法。

SELECT * FROM `table_name` WHERE ( `days` & 1 ) = 1; -- ... and so on

但是我想如果我能在单个查询中做到这一点,那将加快性能。

1 个答案:

答案 0 :(得分:3)

您可以在要扩展的位掩码之间加入使用UNION ALL构造的常量表;

SELECT a.title, b.value days
FROM mytable a
JOIN (SELECT 1 value UNION ALL SELECT 2 UNION ALL SELECT 4 UNION ALL 
      SELECT 8 UNION ALL SELECT 16 UNION ALL SELECT 32 UNION ALL SELECT 64) b
  ON a.days & b.value
ORDER BY title, b.value

An SQLfiddle to test with