【问题标题】:Rename single column in SELECT * in SQL, select all but a column在 SQL 中重命名 SELECT * 中的单个列,选择除一列之外的所有列
【发布时间】:2012-12-25 13:51:28
【问题描述】:

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

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 完全消失) 还是选择性*,我可以选择除某些列之外的所有列? (这也将解决上一个语句中提出的问题)

我知道枚举所有列并创建适当查询的技巧,但我仍然希望有一种“更简单”的方法来做到这一点。

【问题讨论】:

  • 选择 * 不是一个好主意。只需列出所有列。选择 * 适合在提示符下输入的人,而不适合高效的程序。
  • 感谢您的及时回复,但我实际上需要所有列,并且不想通过获取表架构和构建查询来枚举它们。
  • 所以列出所有的列。 SQL 语法禁止将 * 与其他任何内容组合。
  • 别无选择。 SQL 没有。您必须编写一个程序来读取元数据并生成您的创建视图。

标签: sql select


【解决方案1】:

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

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

【讨论】:

  • 并不总是更好,因为表的结构可能会改变,这可能对开发人员来说是隐藏的,尤其是在你不能使用 ORM 并且需要原生查询的地方。
【解决方案2】:

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和mariadb也支持吗?
  • @beppe9000 不,这是 Google BigQuery 扩展
【解决方案3】:

实际上,在 MySQL 中有一种方法可以做到这一点。您需要使用 hack 来选择除 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; 

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 2013-01-01
    • 2017-09-24
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    相关资源
    最近更新 更多