使用别名

时间:2017-09-08 09:58:09

标签: mysql switch-statement case alias

我正在尝试执行一个SQL语句,它从模式中的两个表中选择数据,并使用别名匹配某些值。但是,我在案例切换方案中遇到一些困难,需要一些帮助。

表格中的示例数据

TBL1

:EID(作为PK),电台,合作,持续时间,时间戳,方向,拨打

数据

  • 1006,100,14,00:01:21,2017-08-21 09:40:00,O,1234567890
  • 1007,102,14,00:00:14,2017-08-21 09:53:00,I,RING 00:05
  • 1008,105,00,00:00:45,2017-08-21 09:57:00,E,100

TBL2

:ext(作为PK),用户

数据

  • 100,Joe Soap
  • 105,Sue Blossom

查询:

SELECT log.EID, xtn.user, log.duration, log.direction, log.dialed,
    CASE WHEN log.direction = "E" THEN log.dialed = xtn.ext
         ELSE log.dialed = log.dialed END
from schema.tbl1 AS log, schema.tbl2 AS xtn
WHERE log.station = xtn.ext 

ORDER BY station asc;

预期结果:

  • 1006,Joe Soap,00:01:21,O,1234567890,1234567890
  • 1007,Bob Caller,00:00:14,I,RING 00:05,RING 00:05
  • 1008,Sue Blossom,00:00:45,E,100,Joe Soap

实际结果:

  • 1006,Joe Soap,00:01:21,O,1234567890,1
  • 1007,Bob Caller,00:00:14,I,RING 00:05,1
  • 1008,Sue Blossom,00:00:45,E,100,0

问题解释:

SELECT 查询应该从两个表中获取数据,并且case切换 log.direction 列以检查它是否包含“E”,然后它应该通过在 xtn.ext 列中查找它来选择适当的值,并相应地显示 xtn.user 值。

执行时,它会正确识别工作站并将该列替换为用户,但它在末尾的列中显示逻辑1或0值(表明逻辑正在迭代),但不是实际需要的数据

如果log.direction行值为E,则应查找用户名。 如果log.direction行值是其他任何值,它应该显示log.direction的原始数据(直到添加了未来的实现)。应省略物理log.direction选择,但此示例包含该示例以显示演示应如何运行。

1 个答案:

答案 0 :(得分:1)

您的CASE表达式无效,因为它正在进行分配。 CASE表达式的谓词(即THENELSE之后的任何内容)必须是单数。在任何情况下,您似乎只是尝试显示一个可能的两个值,具体取决于日志方向的值。

SELECT
    log.EID,
    xtn.user,
    log.duration,
    log.direction,
    log.dialed,
    CASE WHEN log.direction = "E"
         THEN xtn.ext
         ELSE log.dialed END
FROM schema.tbl1 AS log
INNER JOIN schema.tbl2 AS xtn
    ON log.station = xtn.ext 
ORDER BY station;

顺便说一下,您会注意到我重构了您的查询以使用两个表之间的显式连接。这是现代的连接方式。

作为旁注,您可能想知道CASE表达式的当前输出中的0和1值是什么。我的猜测是,这些是您正在进行的作业/比较的返回值。

相关问题