如何在sqlite values子句中命名输出列?

时间:2017-05-11 10:58:25

标签: sqlite

如果我在sqlite3(3.17.0)中运行此查询

select T.* from (values (1),(2),(3),(4),(5)) as T;

我得到以下输出,其中没有T的第一列的名称。

----------
1
2
3
4
5

如何给T的第一列命名/别名,或者,有没有办法通过索引以某种方式引用它?

5 个答案:

答案 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 queryWHERE 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设置(我目前尚不具备足够的知识来介绍),但似乎都可以引用生成的列名并为其加上别名。

也就是说,使用列标题column1column2等生成VALUES表的列;因此,您只需通过显式引用特定的生成的列名来为列添加别名。

SELECT
   v.[column1] [Id]
  ,v.[column2] [Name]
FROM (VALUES (1, 'Alex'), (2, 'Brad'), (3, 'Mary'), (4, 'Jennifer')) [v]

Screenshot of Executing SQL in DB Browser Sqlite

答案 4 :(得分:0)

根据SQLite documentation

  

短语“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”是您的列名/别名。