这是我正在尝试做的事情 - 我有一个包含大量列的表,并希望创建一个视图,其中一个列根据其他列中的某些值组合重新分配,例如
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.,,,,
其中年龄实际上是计算的年龄。
我可以选择重命名SELECT * and A_1 as A, B_1 as b
吗? (然后A_1完全消失)
或选择性*我可以选择除特定列之外的所有列? (这也将解决前一个陈述中提出的问题)
我知道我列举所有列并创建适当查询的hacky方式,但我仍然希望有一种“更简单”的方法来执行此操作。
答案 0 :(得分:8)
很抱歉,不,没有办法根据需要使用SELECT *
构造替换现有列名。
最好明确定义列,尤其是视图,而不要使用SELECT *
。在创建视图时,只需使用表的DDL作为模型。这样,您可以更改所需的任何列定义(如在您的问题中),并消除不适合视图的列。我们使用此技术来屏蔽或删除包含社会安全号码和密码等敏感数据的列。 marc_s在评论中提供的链接是一个很好的阅读。
答案 1 :(得分:1)
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
答案 2 :(得分:1)
实际上,MySQL中有一种方法可以做到这一点。您需要使用技巧来选择here中除一列之外的所有列,然后将其单独添加到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;