如果我在sqlite3(3.17.0)中运行此查询
select T.* from (values (1),(2),(3),(4),(5)) as T;
我得到以下输出,其中没有T的第一列的名称。
----------
1
2
3
4
5
如何给T的第一列命名/别名,或者,有没有办法通过索引以某种方式引用它?
答案 0 :(得分:2)
VALUES form of a query没有任何指定列名的机制。 (VALUES子句旨在用于CTE或视图,您可以在其他地方指定列名。)
碰巧,VALUES返回的列确实有名称(但它们没有记录):
sqlite> .header on sqlite> .mode columns sqlite> values (42); column1 ---------- 42
在任何情况下,即使该名称不能在子查询中存在,空列名也没有问题:
select "" from (values (1),(2),(3),(4),(5));
要应用列名称,请围绕它包裹CTE:
WITH T(my_column) AS (
VALUES (1),(2),(3),(4),(5)
)
SELECT * FROM T;
或使用compound query(WHERE 0
会抑制第一个查询中的行):
SELECT NULL AS my_column WHERE 0
UNION ALL
VALUES (1),(2),(3),(4),(5);
答案 1 :(得分:2)
select 1 a union all
select T.* from (values (1),(2),(3),(4),(5)) as T;
a
---
1
1
2
3
4
5
小技巧,现在你有了专栏
答案 2 :(得分:2)
Editor Files
答案 3 :(得分:2)
尽管我推荐@Catherine提供的CTE答案-由于它似乎不仅在某些情况下执行得比我将提供的答案快,而且还鼓励了与诸如可重用性和单一责任等原则相关的开发模式和方法。 / p>
尽管此答案(可能还有所有这些答案)取决于PRAGMA
设置(我目前尚不具备足够的知识来介绍),但似乎都可以引用生成的列名并为其加上别名。
也就是说,使用列标题column1
,column2
等生成VALUES表的列;因此,您只需通过显式引用特定的生成的列名来为列添加别名。
SELECT
v.[column1] [Id]
,v.[column2] [Name]
FROM (VALUES (1, 'Alex'), (2, 'Brad'), (3, 'Mary'), (4, 'Jennifer')) [v]
答案 4 :(得分:0)
短语“VALUES(expr-list)”与“SELECT”意思相同 expr-list“。短语”VALUES(expr-list-1),...,(expr-list-N)“表示 与“SELECT expr-list-1 UNION ALL ... UNION ALL SELECT”相同 EXPR列表-N”。
所以,你可以改为:
SELECT T.a FROM (
SELECT 1 as a
UNION ALL
SELECT 2 as a
UNION ALL
SELECT 3 as a
UNION ALL
SELECT 4 as a
UNION ALL
SELECT 5 as a
) as T;
然后“a”是您的列名/别名。