【问题标题】:MySQL View Logic with CaseMySQL 视图逻辑与案例
【发布时间】:2016-09-08 19:07:47
【问题描述】:

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

原始代码示例:

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 使查询返回我需要的内容。不用说这不起作用,显然是错误的......但它确实显示了我正在尝试使用的逻辑。

修改后的代码示例:

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;

【问题讨论】:

    标签: mysql case sql-view


    【解决方案1】:

    您将 AS 子句放在错误的位置。整个CASE 表达式产生一个值,您将别名分配给该值。并且您不要在 WHEN 子句之间或在 case 之后使用 ;,因为这会结束整个查询。 WHEN 子句之间没有分隔符,整个表达式用, 与其他SELECT 列分隔。

    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 表达式类似。

    【讨论】:

    • 我明天会试一试,如果它工作正常,我会支持你的答案。我有一种感觉,我写错了三遍……我同时使用逗号和分号来分隔 WHEN 子句。由于 MySQL 文档示例 here,我认为我必须这样做。
    • 该文档用于CASE 语句,用于存储过程;分号用于它控制的语句的结尾。 CASE 表达式被描述为here
    • 谢谢巴尔玛!你对一切都是正确的。我设法让它工作,虽然现在我遇到了其他问题,但它们是我可以解决的逻辑问题。
    猜你喜欢
    • 2021-09-13
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多