将SQLite列转换为行

5

我正在尝试将一条返回多个列的单行查询转换为返回一个或多个列的多行查询。例如,我的查询如下所示:

SELECT _id, value1, value2, value3, value4 FROM table WHERE _id IS 1;

结果:

_id   value1   value2   value3   value4
----------------------------------------
1     10       11       12       13

我希望我的结果看起来像以下内容:
name    value
--------------
value1  10
value2  11
value3  12
value4  13

但我也可以使用类似这样的工具进行工作:

value
-----
10
11
12
13

目前我正在使用Android中的MatrixCursor手动转换,但理想情况是光标已经处于可用状态。是否有一种方法可以修改我的查询,以按照所需的模式检索结果或使用类似临时表的东西来实现期望的最终状态?

此外,在数据库中是否有一个常见术语来描述这种功能?


如果您只是想暂时存储结果,那么可以将其存储在List或Map中,如果需要同时存储名称和值。 - Darshan Soni
ID不能重复。它应该是唯一的。因此,您不能在多个行中拥有相同的ID。 - Vladyslav Matviienko
谢谢您的回复Darshan,我已经将结果存储在MatrixCursor中,但是在使用CursorAdaptor时会导致很多复杂性。最简单的方法是通过选择将数据转换为首选布局。我的MatrixCursor已经在工作,我只是在寻找更优雅的解决方案。@Vlad,这是一个好观点,我对保留ID并不是特别感兴趣,因为我已经知道该值(我正在查询它)。但主要问题是将每个结果的列添加为新行。 - Adrian Stratienco
2个回答

4

没有内置机制能够自动完成这个操作。

如果您知道每一列,您可以构造一个查询来逐个处理每一列:

SELECT _id, 'value1' AS name, value1 AS value FROM tab WHERE _id = 1
UNION ALL
SELECT _id, 'value2' AS name, value2 AS value FROM tab WHERE _id = 1
UNION ALL
SELECT _id, 'value3' AS name, value3 AS value FROM tab WHERE _id = 1
UNION ALL
SELECT _id, 'value4' AS name, value4 AS value FROM tab WHERE _id = 1;

这不一定比 MatrixCursor 更好。

3
为什么不直接在值表上执行JOIN,然后使用CASE语句选择正确的列?
SELECT original_table._id,
  CASE t.column1 WHEN 1 THEN 'value1' WHEN 2 THEN 'value2' WHEN 3 THEN 'value3' ELSE 'value4' END AS name, 
  CASE t.column1 WHEN 1 THEN  original_table.value1 WHEN 2 THEN  original_table.value2 WHEN 3 THEN  original_table.value3 ELSE  original_table.value4 END AS value
FROM (
  select 1 _id, 10 value1 , 11 value2 , "string value" value3 , 13 value4
  union all 
  select 2, 14,  "string value",null,17
) original_table
JOIN (VALUES(1),(2),(3),(4)) t
--ORDER BY _id, t.column1;

结果:
id  name    value
1   value1  10
1   value2  11
1   value3  string value
1   value4  13
2   value1  14
2   value2  string value
2   value3  {null}
2   value4  17

或者添加以下内容以避免空值:

 ON (t.column1=1 AND original_table.value1 IS NOT NULL) OR (t.column1=2 AND original_table.value2 IS NOT NULL) OR (t.column1=3 AND original_table.value3  IS NOT NULL) OR (t.column1=4 AND original_table.value4  IS NOT NULL) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接