在 SQLite 中取消嵌套(或类似的)

Unnest (or similar) in SQLite

我想 return 多行作为单行由 Android 游标适配器处理。

我目前有一个带有日期列的 table,我想 return 作为一个单独的行,所有具有相同日期的行。

考虑以下 table:

     ID |   Name   |   Date
 -------------------------------
      1 |  'Mark'  | '08/06/15'
      2 |  'Peter' | '08/06/15'
      3 |  'Henry' | '08/06/15'
      4 |  'Bob'   | '17/04/16'
      5 |  'Tony'  | '23/08/13'
      6 |  'Tim'   | '17/04/16'

我想查询的结果如下:

         Date    |       Names
    ------------------------------------
      '08/06/15' | 'Mark, Peter, Henry'
      '17/04/16' | 'Bob, Tim'
      '23/08/13' | 'Tony'

使用 this link 我能够获得以下查询:

SELECT t1.id, GROUP_CONCAT(t1.Name ) AS Names
FROM Table1 t1 JOIN Table2 t2 ON t1.ID = t2.ID
GROUP BY t1.ID;

但是,由于所有数据都来自同一个 table,而且我提前知道要查询的日期,所以我希望将 JOIN 与输入数组一起使用,并得到 SQLite 解析它(即像 Postgres 中的 unnest),就好像它来自实际的 table.

数组类似于:

['08/06/15', '17/04/16', '23/08/13', '09/08/18']

这也可以通过嵌套 SQL 查询来完成,但如果可能,我想要一个优化的解决方案。

SQLite 没有数组类型。

最简单的方法是使用 IN operator:

SELECT ID, group_concat(Name) AS Names
FROM MyTable
WHERE Date IN ('08/06/15', '17/04/16', '23/08/13', '09/08/18')
GROUP BY ID;

如果你真的想使用连接,你可以用 VALUES clause(在 Android Jelly Bean 或更高版本中)或复合查询构造一个虚拟 table:

SELECT ID, group_concat(Name) AS Names
FROM MyTable
JOIN (VALUES('08/06/15'), ('17/04/16'), ('23/08/13'), ('09/08/18'))
  ON Date = column1
GROUP BY ID;
SELECT ID, group_concat(Name) AS Names
FROM MyTable
JOIN (SELECT '08/06/15' AS Date UNION ALL
      SELECT '17/04/16'         UNION ALL
      SELECT '23/08/13'         UNION ALL
      SELECT '09/08/18'                  ) USING (Date)
GROUP BY ID;

这是你想要的吗:

SELECT Date, group_concat(Name) AS Names
FROM table_name
GROUP BY Date;