在SQL中的SELECT*中重命名单列,选择除列之外的所有列

0fn*_*fnt 14 sql select

这是我正在尝试做的事情 - 我有一个包含大量列的表,并希望创建一个视图,其中一个列基于其他列中的某些值组合重新分配,例如

Name, Age, Band, Alive ,,, <too many other fields)

我想要一个将重新分配其中一个字段的查询,例如

Select *, Age = 
CASE When "Name" = 'BRYAN ADAMS' AND "Alive" = 1 THEN 18
     ELSE "Age"
END
FROM Table
Run Code Online (Sandbox Code Playgroud)

但是,我现在拥有的架构是 Name, Age, Band, Alive,,,,<too many>,, Age

我可以在我的选择陈述中使用'AS'来制作它 Name, Age, Band, Alive,,,,<too many>,, Age_Computed.

但是,我想要达到Name, Age, Band, Alive.,,,,Age实际上是计算年龄的原始模式 .

我可以选择重命名SELECT * and A_1 as A, B_1 as b吗?(然后A_1完全消失)或选择性*我可以选择除特定列之外的所有列?(这也将解决前一个声明中提出的问题)

我知道我列举所有列并创建适当查询的hacky方式,但我仍然希望有一种"更简单"的方法来实现这一点.

Bel*_*Bob 9

抱歉,不,没有办法根据需要使用SELECT *构造替换现有列名.

明确定义列总是更好,特别是对于视图,从不使用SELECT *.在创建视图时,只需使用表的DDL作为模型.这样,您可以更改所需的任何列定义(如在您的问题中),并消除不适合视图的列.我们使用此技术来屏蔽或删除包含社会安全号码和密码等敏感数据的列.marc_s在评论中提供的链接是一个很好的阅读.

  • 并不总是更好,因为表的结构可能会发生变化,这可能对开发人员来说是隐藏的,特别是在无法使用 ORM 且需要本机查询的地方。 (5认同)

Luk*_*zda 7

Google BigQuery 支持SELECT * REPLACE:

SELECT * REPLACE 语句指定一个或多个表达式 AS 标识符子句。每个标识符必须与 SELECT * 语句中的列名匹配。

在输出列列表中,与 REPLACE 子句中的标识符匹配的列将替换为该 REPLACE 子句中的表达式。

SELECT * REPLACE 语句不会更改列的名称或顺序。但是,它可以更改值和值类型。


Select *, Age = CASE When "Name" = 'BRYAN ADAMS' AND "Alive" = 1 THEN 18
                     ELSE "Age"
                END
FROM tab
=>
SELECT * REPLACE(CASE WHEN Name = 'BRYAN ADAMS' AND Alive = 1 THEN 18
                      ELSE Age END AS Age)
FROM Tab
Run Code Online (Sandbox Code Playgroud)