繁体   English   中英

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

[英]Rename single column in SELECT * in SQL, select all but a column

这是我想要做的 - 我有一个包含很多列的表,并且想要创建一个视图,其中一个列根据其他列中的某些值组合重新分配,例如

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

但是,我现在拥有的架构是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方式,但我仍然希望有一种“更简单”的方法来做到这一点。

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

明确定义列总是更好,尤其是对于视图,并且永远不要使用SELECT * 创建视图时,只需使用表的 DDL 作为模型即可。 这样你就可以改变你想要的任何列定义(如你的问题)并消除不适合视图的列。 我们使用这种技术来屏蔽或消除包含敏感数据(如社会安全号码和密码)的列。 marc_s 在评论中提供的链接很好读。

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

实际上,在 MySQL 中有一种方法可以做到这一点。 您需要使用 hack 选择此处发布的除一列之外的所有列,然后将其单独添加到AS语句中。

下面是一个例子:

-- Set-up some example data
DROP TABLE IF EXISTS test;
CREATE TABLE `test` (`ID` int(2), `date` datetime, `val0` varchar(1), val1 INT(1), val2 INT(4), PRIMARY KEY(ID, `date`));
INSERT INTO `test` (`ID`, `date`, `val0`, `val1`, `val2`) VALUES
(1, '2016-03-07 12:20:00', 'a', 1, 1001),
(1, '2016-04-02 12:20:00', 'b', 2, 1004),
(1, '2016-03-01 10:09:00', 'c', 3, 1009),
(1, '2015-04-12 10:09:00', 'd', 4, 1016),
(1, '2016-03-03 12:20:00', 'e', 5, 1025);

-- Select all columns, renaming 'val0' as 'yabadabadoo':
SET @s = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), 'val0,', '') 
  FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'test' AND TABLE_SCHEMA = 
  '<database_name>'), ', val0 AS `yabadabadoo` FROM test');

PREPARE stmt1 FROM @s;
EXECUTE stmt1; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM