MySQL 带别名的大小写切换
MySQL Case switching with aliasing
我正在尝试执行 SQL 语句,selects 来自模式中两个表的数据,并使用别名匹配某些值。但是,我在案例切换场景中遇到了一些困难,需要一些帮助。
表格中的示例数据
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, 我, RING 00:05
- 1008, 105, 00, 00:00:45, 2017-08-21 09:57:00, E, 100
Tbl2
列:分机(作为主键),用户
数据:
- 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,乔肥皂,00:01:21,O,1234567890,1234567890
- 1007,Bob Caller,00:00:14,我,RING 00:05,RING 00:05
- 1008,苏花,00:00:45,E,100,乔肥皂
实际结果:
- 1006, 乔肥皂, 00:01:21, O, 1234567890, 1
- 1007,鲍勃来电,00:00:14,我,响铃 00:05,1
- 1008,苏花,00:00:45,E,100,0
问题解释:
SELECT 查询应该从两个表中获取数据,并且大小写切换 log.direction列检查它是否包含 "E",然后它应该 select 通过在 xtn.ext 中查找适当的值 列,并相应地显示 xtn.user 值。
执行时,它正确识别了车站并将该列替换为用户,但它在末尾的列中给出了逻辑值 1 或 0(这表明逻辑迭代正确),但不是实际需要的数据。
如果 log.direction 行值为 E,它应该查找用户名。
如果 log.direction 行值是其他任何内容,它应该显示 log.direction 的原始数据(直到添加未来实现)。物理 log.direction selection 应省略,但包含在该示例中以显示演示应如何基本运行。
您的 CASE
表达式无效,因为它正在赋值。 CASE
表达式(即 THEN
或 ELSE
之后的谓词)必须是单数 values。在任何情况下,您似乎只是在尝试根据日志方向的值显示可能的两个值之一。
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 值从何而来。我的猜测是,这些是您制作的 assignments/comparisons 的 return 值。
我正在尝试执行 SQL 语句,selects 来自模式中两个表的数据,并使用别名匹配某些值。但是,我在案例切换场景中遇到了一些困难,需要一些帮助。
表格中的示例数据
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, 我, RING 00:05
- 1008, 105, 00, 00:00:45, 2017-08-21 09:57:00, E, 100
Tbl2
列:分机(作为主键),用户
数据:
- 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,乔肥皂,00:01:21,O,1234567890,1234567890
- 1007,Bob Caller,00:00:14,我,RING 00:05,RING 00:05
- 1008,苏花,00:00:45,E,100,乔肥皂
实际结果:
- 1006, 乔肥皂, 00:01:21, O, 1234567890, 1
- 1007,鲍勃来电,00:00:14,我,响铃 00:05,1
- 1008,苏花,00:00:45,E,100,0
问题解释:
SELECT 查询应该从两个表中获取数据,并且大小写切换 log.direction列检查它是否包含 "E",然后它应该 select 通过在 xtn.ext 中查找适当的值 列,并相应地显示 xtn.user 值。
执行时,它正确识别了车站并将该列替换为用户,但它在末尾的列中给出了逻辑值 1 或 0(这表明逻辑迭代正确),但不是实际需要的数据。
如果 log.direction 行值为 E,它应该查找用户名。 如果 log.direction 行值是其他任何内容,它应该显示 log.direction 的原始数据(直到添加未来实现)。物理 log.direction selection 应省略,但包含在该示例中以显示演示应如何基本运行。
您的 CASE
表达式无效,因为它正在赋值。 CASE
表达式(即 THEN
或 ELSE
之后的谓词)必须是单数 values。在任何情况下,您似乎只是在尝试根据日志方向的值显示可能的两个值之一。
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 值从何而来。我的猜测是,这些是您制作的 assignments/comparisons 的 return 值。