如果我在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)
查询的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)
尽管我推荐 @Catherine 提供的 CTE 答案 - 因为它不仅在某些情况下看起来比我提供的答案执行得更快,而且鼓励与可重用性和单一责任等原则相关的开发模式和方法。
尽管这个答案(可能还有所有这些答案)取决于PRAGMA设置(我目前没有足够的知识来涵盖),但似乎可以引用生成的列名称并为它们添加别名。
也就是说,VALUES 表的列是用列标题生成的:column1,column2等等;因此,您只需通过显式引用特定的生成的列名称来为列添加别名。
SELECT
v.[column1] [Id]
,v.[column2] [Name]
FROM (VALUES (1, 'Alex'), (2, 'Brad'), (3, 'Mary'), (4, 'Jennifer')) [v]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2010 次 |
| 最近记录: |