我正在尝试执行一个SQL语句,它从模式中的两个表中选择数据,并使用别名匹配某些值。但是,我在案例切换方案中遇到一些困难,需要一些帮助。
表格中的示例数据
TBL1
列:EID(作为PK),电台,合作,持续时间,时间戳,方向,拨打
数据:
TBL2
列:ext(作为PK),用户
数据:
查询:
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;
预期结果:
实际结果:
问题解释:
SELECT 查询应该从两个表中获取数据,并且case切换 log.direction 列以检查它是否包含“E”,然后它应该通过在 xtn.ext 列中查找它来选择适当的值,并相应地显示 xtn.user 值。
执行时,它会正确识别工作站并将该列替换为用户,但它在末尾的列中显示逻辑1或0值(表明逻辑正在迭代),但不是实际需要的数据
如果log.direction行值为E,则应查找用户名。 如果log.direction行值是其他任何值,它应该显示log.direction的原始数据(直到添加了未来的实现)。应省略物理log.direction选择,但此示例包含该示例以显示演示应如何运行。
答案 0 :(得分:1)
您的CASE
表达式无效,因为它正在进行分配。 CASE
表达式的谓词(即THEN
或ELSE
之后的任何内容)必须是单数值。在任何情况下,您似乎只是尝试显示一个可能的两个值,具体取决于日志方向的值。
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值是什么。我的猜测是,这些是您正在进行的作业/比较的返回值。