在视图中使用已创建的列

bakd9h0s  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(339)

我已经把这个简化到最小的可能情况,所以像“为什么”这样的细节可能已经消失了;-)我有一个包含两列的数据库表:

  1. A varchar(1) | B (integer)

我想创建一个视图,在其中添加一个“total” if A = 1 then total = B * 10 else total = B * 5 例如

  1. A B Total
  2. -----------
  3. 1 1 10
  4. 1 2 20
  5. 2 1 5
  6. 2 2 10

但我想知道我是用10还是5,所以我想要一个“b值”列,如下所示:

  1. A B BVal Total
  2. ----------------
  3. 1 1 10 10
  4. 1 2 10 20
  5. 2 1 5 5
  6. 2 2 5 10

所以我试着创建一个视图:

  1. select A, B, (case A when 1 then 10 else 5 end) as Bval, B * Bval as Total from dummy

但我有个错误: #1054 - Unknown column 'Bval' in 'field list' . 不管怎样,有没有办法在一个视图中实现这一点?
对于想要足够信息来diy的人:

  1. CREATE TABLE IF NOT EXISTS `dummy` (
  2. `A` varchar(1) NOT NULL,
  3. `B` int(11) NOT NULL
  4. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  5. --
  6. -- Dumping data for table `dummy`
  7. --
  8. INSERT INTO `dummy` (`A`, `B`) VALUES
  9. ('A', 1),
  10. ('A', 2),
  11. ('B', 1),
  12. ('B', 2);
  13. CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `dummyview`
  14. AS SELECT `dummy`.`A`, `dummy`.`B`,
  15. (case `dummy`.`A` when 1 then 10 else 5 end) as `BVal`,
  16. `dummy`.`B` * `BVal` as `Total`
  17. FROM `dummy`;
fquxozlt

fquxozlt1#

不能在同一select子句中重用别名,因此必须重复 CASE 表达式:

  1. SELECT
  2. A,
  3. B,
  4. (CASE A WHEN 1 THEN 10 ELSE 5 END) AS Bval,
  5. B * (CASE A WHEN 1 THEN 10 ELSE 5 END) AS Total
  6. FROM dummy;

至于为什么会出现这种情况,在计算select子句时别名还不可用。
请注意,可以将当前查询 Package 在子查询中以使用 B 别名。但是,不要这样做,因为这可能会影响性能。

xzlaal3s

xzlaal3s2#

由于bval是计算字段,您需要使用如下所示的内部查询

  1. select
  2. A,
  3. B,
  4. BVal,
  5. BVal * B as Total
  6. from
  7. (
  8. select
  9. A,
  10. B,
  11. (case A when 1 then 10 else 5 end) as Bval
  12. from dummy) innerQuery

相关问题