首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带案例的MySQL视图逻辑

问带案例的MySQL视图逻辑
EN

Stack Overflow用户
提问于 2016-05-12 19:10:12
回答 1查看 345关注 0票数 0

我的任务是编辑我们的一个MySQL视图,以包括它丢失的行。问题是前面的视图查询使用的是if()语句,由于某种原因,我们没有捕获所有的表行。我绝不是一个SQL大师,我无法理解这一点.

原始代码示例:

代码语言:javascript
复制
CREATE VIEW `b2b_data` AS SELECT 
`asteriskcdrdb`.`cdr`.`uniqueid` AS `callid`,
`asteriskcdrdb`.`cdr`.`calldate` AS `ENTER`,
if((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal'),`asteriskcdrdb`.`cdr`.`did`,`asteriskcdrdb`.`cdr`.`src`) AS `caller_id`,
if((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal'),'outbound','inbound') AS `direction`,
if((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal'),`asteriskcdrdb`.`cdr`.`src`,substr(`asteriskcdrdb`.`cdr`.`dstchannel`,5,3)) AS `AGENT`,
sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`,
`asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`,
if((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal'),`asteriskcdrdb`.`cdr`.`dstchannel`,`asteriskcdrdb`.`cdr`.`did`) AS `ROUTE`,
`asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE (((`asteriskcdrdb`.`cdr`.`dst` = '601') AND (`asteriskcdrdb`.`cdr`.`dcontext` = 'ext-group')) OR ((`asteriskcdrdb`.`cdr`.`dst` = '601') AND (`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal-xfer')) OR ((`asteriskcdrdb`.`cdr`.`dcontext` = 'from-internal') AND (`asteriskcdrdb`.`cdr`.`src` in ('143','146','317','318','320','225','214'))))

我在网上读到,IF...ELSEIF只在存储过程和函数中工作。所以我放弃了这个想法。然后我想也许我可以用CASE来让查询返回我所需要的东西。不用说,这是行不通的,显然是错误的.但它确实显示了我试图使用的逻辑。

调制代码示例:

代码语言:javascript
复制
CREATE VIEW `b2b_data` AS SELECT
`asteriskcdrdb`.`cdr`.`uniqueid` AS `callid`,
`asteriskcdrdb`.`cdr`.`calldate` AS `ENTER`,

CASE `asteriskcdrdb`.`cdr`.`dcontext`
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`did` AS `caller_id`;
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`src` AS `caller_id`;
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`src` AS `caller_id`;
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`src` AS `caller_id`;
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`src` AS `caller_id`;
END CASE;

CASE `asteriskcdrdb`.`cdr`.`dcontext`
    WHEN 'from-internal' THEN 'outbound' AS `direction`;
    WHEN 'from-internal-xfer' THEN 'inbound' AS `direction`;
    WHEN 'ext-local' THEN 'inbound' AS `direction`;
    WHEN 'ext-group' THEN 'inbound' AS `direction`;
    WHEN 'from-did-direct' THEN 'inbound' AS `direction`;
END CASE;

CASE `asteriskcdrdb`.`cdr`.`dcontext`
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`src` AS `AGENT`;
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`dst` AS `AGENT`;
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`dst` AS `AGENT`;
    WHEN 'ext-group' THEN substr(`asteriskcdrdb`.`cdr`.`dstchannel`;5;3)) AS `AGENT`;
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`dst` AS `AGENT`;
END CASE;

CASE `asteriskcdrdb`.`cdr`.`dcontext`
    WHEN 'from-internal' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`;
    WHEN 'from-internal-xfer' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`;
    WHEN 'ext-local' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`;
    WHEN 'ext-group' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`;
    WHEN 'from-did-direct' THEN sec_to_time(`asteriskcdrdb`.`cdr`.`duration`) AS `AGENT_TIME`;
END CASE;

CASE `asteriskcdrdb`.`cdr`.`dcontext`
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`;
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`;
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`;
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`;
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`disposition` AS `DISPOSITION`;
END CASE;

CASE `asteriskcdrdb`.`cdr`.`dcontext`
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`dstchannel` AS `ROUTE`;
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`dstchannel` AS `ROUTE`;
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`did` AS `ROUTE`;
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`did` AS `ROUTE`;
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`did` AS `ROUTE`;
END CASE;

CASE `asteriskcdrdb`.`cdr`.`dcontext`
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`src` IN ('143';'146';'317';'318';'320';'225';'214');
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`dst` IN ('143';'146';'317';'318';'320';'225';'214');
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`dst` IN ('143';'146';'317';'318';'320';'225';'214');
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`dst` = '601';
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`recordingfile` AS `RECORDING` FROM `asteriskcdrdb`.`cdr` WHERE `asteriskcdrdb`.`cdr`.`dst` IN ('143';'146';'317';'318';'320';'225';'214');
END CASE;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-12 20:11:25

你把AS条款放错地方了。整个CASE表达式产生一个值,您可以将别名分配给该值。而且您不在;子句之间或在大小写之后使用WHEN,因为这结束了整个查询。WHEN子句之间没有分隔符,整个表达式与使用,的其他SELECT列分隔开。

代码语言:javascript
复制
CASE `asteriskcdrdb`.`cdr`.`dcontext`
    WHEN 'from-internal' THEN `asteriskcdrdb`.`cdr`.`did`
    WHEN 'from-internal-xfer' THEN `asteriskcdrdb`.`cdr`.`src
    WHEN 'ext-local' THEN `asteriskcdrdb`.`cdr`.`src`
    WHEN 'ext-group' THEN `asteriskcdrdb`.`cdr`.`src`
    WHEN 'from-did-direct' THEN `asteriskcdrdb`.`cdr`.`src`
END CASE AS `caller_id`,

对于tall,其他的CASE表达式也是类似的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37195541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档