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

fei*_*ief 7 sqlite

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

select T.* from (values (1),(2),(3),(4),(5)) as T;
Run Code Online (Sandbox Code Playgroud)

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

----------
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

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

Cat*_*lin 16

with cte(my_column_alias) as 
  (select * from (values (1),(2),(3),(4),(5)))
select * from cte;
Run Code Online (Sandbox Code Playgroud)

  • 完美的。正是我当时所需要的。现在,如果我能记住我需要它的用途就好了。:| (4认同)
  • 别担心!再过一年,你会再次需要它,你会忘记你以前问过这个问题或得到过答案,你会在网络搜索时遇到这个,你甚至不会在一开始注意到它是你自己的问题。至少,这对我来说是这样的。 (3认同)
  • 这可以更短:`with cte(my_column_alias) as (values (1),(2),(3),(4),(5)) select * from cte;` (2认同)

CL.*_*CL. 5

查询VALUES表单没有任何机制供您指定列名。(VALUES子句旨在在CTE或视图中使用,您可以在其他位置指定列名。)

碰巧的是,VALUES返回的列确实具有名称(但未记录):

sqlite> .header上
sqlite> .mode列
sqlite>值(42);
第1栏
----------
42

无论如何,即使该名称不能在子查询中保留下来,空列名称也完全没有问题:

select "" from (values (1),(2),(3),(4),(5));
Run Code Online (Sandbox Code Playgroud)

要应用列名,请在其周围加上CTE:

WITH T(my_column) AS (
  VALUES (1),(2),(3),(4),(5)
)
SELECT * FROM T;
Run Code Online (Sandbox Code Playgroud)

或使用复合查询WHERE 0从第一个查询中删除该行):

SELECT NULL AS my_column WHERE 0
UNION ALL
VALUES (1),(2),(3),(4),(5);
Run Code Online (Sandbox Code Playgroud)


Bre*_*ell 5

尽管我推荐 @Catherine 提供的 CTE 答案 - 因为它不仅在某些情况下看起来比我提供的答案执行得更快,而且鼓励与可重用性和单一责任等原则相关的开发模式和方法。

尽管这个答案(可能还有所有这些答案)取决于PRAGMA设置(我目前没有足够的知识来涵盖),但似乎可以引用生成的列名称并为它们添加别名。

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

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

Run Code Online (Sandbox Code Playgroud)

在DB Browser Sqlite中执行SQL的屏幕截图