【发布时间】:2022-03-14 21:57:55
【问题描述】:
如果我在 sqlite3 (3.17.0) 中运行此查询
select T.* from (values (1),(2),(3),(4),(5)) as T;
我得到以下输出,其中 T 的第一列没有名称。
----------
1
2
3
4
5
如何给 T 的第一列命名/别名,或者,有什么方法可以通过索引以某种方式引用它?
【问题讨论】:
标签: sqlite
如果我在 sqlite3 (3.17.0) 中运行此查询
select T.* from (values (1),(2),(3),(4),(5)) as T;
我得到以下输出,其中 T 的第一列没有名称。
----------
1
2
3
4
5
如何给 T 的第一列命名/别名,或者,有什么方法可以通过索引以某种方式引用它?
【问题讨论】:
标签: sqlite
with cte(my_column_alias) as
(values (1),(2),(3),(4),(5))
select * from cte;
【讨论】:
with cte(my_column_alias) as (values (1),(2),(3),(4),(5)) select * from cte;
VALUES form of a query 没有任何机制让您指定列名。 (VALUES 子句旨在用于 CTE 或视图中,您可以在其中指定列名。)
事实上,VALUES 返回的列确实有名称(但它们没有记录):
sqlite> .header on sqlite> .mode 列 sqlite>值(42); 第 1 列 ---------- 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);
【讨论】:
.header on 时sqlite3 会打印column1,但该列仍未命名。 select column1 from (values (1)) 不起作用。
.header 与 sqlite3 的编译指示(或行为)无关,它只是关于显示(显示\隐藏)的设置您正在运行它的应用程序(sqlite3 cli)的上下文中的列名。编辑:我认为需要澄清。您是否尝试专门为该列添加别名? select column1 as new_column from (values (1))?
select 1 a union all
select T.* from (values (1),(2),(3),(4),(5)) as T;
a
---
1
1
2
3
4
5
小技巧,现在你有了a列
【讨论】:
虽然我推荐 @Catherine 提供的 CTE 答案 - 因为它不仅在某些情况下似乎比我将提供的答案更快,而且鼓励与可重用性和单一责任等原则相关的开发模式和方法。
虽然这个答案(可能是所有这些答案)取决于PRAGMA 设置(我目前没有足够的知识来涵盖),但似乎可以同时引用生成的列名和别名他们。
即生成VALUES表的列,列标题为:column1、column2等;因此,您只需通过显式引用生成的特定列名来为列命名。
SELECT
v.[column1] [Id]
,v.[column2] [Name]
FROM (VALUES (1, 'Alex'), (2, 'Brad'), (3, 'Mary'), (4, 'Jennifer')) [v]
【讨论】:
短语“VALUES(expr-list)”的含义与“SELECT expr-list”。短语“VALUES(expr-list-1),...,(expr-list-N)”表示 与“SELECT expr-list-1 UNION ALL ... UNION ALL SELECT”相同 expr-list-N"。
所以,你可以改成:
SELECT T.a AS my_column_alias 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;
那么“my_column_alias”就是你的列名/别名。
my_column_alias
---------------
1
2
3
4
5
【讨论】: