我已经把这个简化到最小的可能情况,所以像“为什么”这样的细节可能已经消失了;-)我有一个包含两列的数据库表:
A varchar(1) | B (integer)
我想创建一个视图,在其中添加一个“total” if A = 1 then total = B * 10 else total = B * 5
例如
A B Total
-----------
1 1 10
1 2 20
2 1 5
2 2 10
但我想知道我是用10还是5,所以我想要一个“b值”列,如下所示:
A B BVal Total
----------------
1 1 10 10
1 2 10 20
2 1 5 5
2 2 5 10
所以我试着创建一个视图:
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的人:
CREATE TABLE IF NOT EXISTS `dummy` (
`A` varchar(1) NOT NULL,
`B` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `dummy`
--
INSERT INTO `dummy` (`A`, `B`) VALUES
('A', 1),
('A', 2),
('B', 1),
('B', 2);
CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `dummyview`
AS SELECT `dummy`.`A`, `dummy`.`B`,
(case `dummy`.`A` when 1 then 10 else 5 end) as `BVal`,
`dummy`.`B` * `BVal` as `Total`
FROM `dummy`;
2条答案
按热度按时间fquxozlt1#
不能在同一select子句中重用别名,因此必须重复
CASE
表达式:至于为什么会出现这种情况,在计算select子句时别名还不可用。
请注意,可以将当前查询 Package 在子查询中以使用
B
别名。但是,不要这样做,因为这可能会影响性能。xzlaal3s2#
由于bval是计算字段,您需要使用如下所示的内部查询