【问题标题】:MySQL Case switching with aliasingMySQL 使用别名切换大小写
【发布时间】:2017-09-08 09:58:08
【问题描述】:

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

表格中的样本数据

Tbl1

:EID(作为 PK)、站、co、持续时间、时间戳、方向、拨号

数据

  • 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

:分机(作为 PK)、用户

数据

  • 100,乔肥皂
  • 105,苏花

查询:

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,我,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, 苏花, 00:00:45, E, 100, 0

问题说明:

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

执行时,它正确识别站并将该列替换为用户,但它在最后的列中给出逻辑 1 或 0 值(这表明逻辑正在正确迭代),但不是实际需要的数据。

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

【问题讨论】:

    标签: mysql switch-statement case alias


    【解决方案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 值从何而来。我的猜测是这些是您所做的分配/比较的返回值。

    【讨论】:

    • 感谢您的建议。通过对 CASE...THEN 行稍作调整,我设法得到了预期的结果。将 xtn.ext 更改为 xtn.user。 Kudo 的明确加入!
    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2016-03-05
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多