将 SQLite 列转换为行
Turn SQLite columns to rows
我正在尝试将 returns 具有多列的单行查询转换为具有一列或多列的多行。例如,我的查询如下所示:
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 手动转换它,但理想的情况是让光标已经处于可用状态。有没有办法修改我的查询以在我想要的模式中检索结果,或者使用类似临时 table 的东西来达到想要的最终状态?
此外,是否有一个通用术语来描述数据库中的此功能?
没有可以自动执行此操作的内置机制。
如果您知道这些列,则可以构造一个单独处理每一列的查询:
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 好。
为什么不 JOIN
值 table 然后 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)
我正在尝试将 returns 具有多列的单行查询转换为具有一列或多列的多行。例如,我的查询如下所示:
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 手动转换它,但理想的情况是让光标已经处于可用状态。有没有办法修改我的查询以在我想要的模式中检索结果,或者使用类似临时 table 的东西来达到想要的最终状态?
此外,是否有一个通用术语来描述数据库中的此功能?
没有可以自动执行此操作的内置机制。
如果您知道这些列,则可以构造一个单独处理每一列的查询:
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 好。
为什么不 JOIN
值 table 然后 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)