24

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

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

4

3 回答 3

14

抱歉,不,没有一种方法可以根据需要使用SELECT *构造替换现有的列名。

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

于 2012-12-25T16:15:51.467 回答
4

谷歌 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
于 2018-09-09T11:11:20.660 回答
1

实际上,在 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; 
于 2020-10-19T14:53:35.893 回答