将 CASE 与表连接一起使用

Posted

技术标签:

【中文标题】将 CASE 与表连接一起使用【英文标题】:Using CASE with Table Join 【发布时间】:2020-12-16 01:19:31 【问题描述】:

我正在使用 Oracle 11g。

我有两张桌子:

我想显示 student_name、课程、费用和一个带有折扣费用的列,如果是“BIT”或“MIT”,费用将减少 10%。

我想出了以下查询,但它给出了一个错误:

ORA-00923:未在预期位置找到 FROM 关键字:

SQL> SELECT Student.student_name, Specification.course, Specification.specification_name, Specification.fee
  2  FROM Student
  3  JOIN Specification ON Student.specification_id = Specification.specification_id
  4     CASE Specification.course WHEN 'BIT' THEN 0.9 * Specification.fee
  5                               WHEN 'MIT' THEN 0.9 * Specification.fee
  6     ELSE Specification.fee END "DISCOUNTED FEE";

【问题讨论】:

我不熟悉 Oracle,但对于大多数 SQL,您会在 from 之前添加 case 表达式。 我也试过了,还是报同样的错误 我对此表示怀疑,请告诉我们 另外我强烈建议使用表别名以提高可读性。 您使用的是什么版本的 Oracle?执行SELECT * FROM V$VERSION,然后编辑您的问题并包含此信息以及表的规范(所有字段名称、数据类型和键(主键和外键))。这可能让我们理解为什么一个简单的 CASE 表达式会导致这样的困难。 【参考方案1】:

根据您的问题,您似乎需要在SELECT 中使用CASE WHEN 而不是FROM

SELECT Student.student_name, Specification.course, Specification.specification_name, Specification.fee,
       (CASE WHEN  Specification.cours = 'BIT' THEN 0.9 * Specification.fee
             WHEN  Specification.cours = 'MIT' THEN 0.9 * Specification.fee
        ELSE Specification.fee END) "DISCOUNTED FEE"
FROM Student
JOIN 
    Specification ON Student.specification_id = Specification.specification_id;

我想使用CASE WHENIN 让SQL 更简洁。

SELECT Student.student_name, Specification.course, Specification.specification_name, Specification.fee,
       (CASE WHEN Specification.cours IN ('BIT','MIT') THEN 0.9 * Specification.fee
        ELSE Specification.fee END) "DISCOUNTED FEE"
FROM Student
JOIN 
    Specification ON Student.specification_id = Specification.specification_id;

【讨论】:

这给出了一个错误 ORA-00905:在 CASE 语句中缺少关键字。明白要点谢谢 @SamitPaudel 我的编辑答案对你有用吗?【参考方案2】:

你可以使用decode如下:

SELECT Student.student_name, 
       Specification.course, 
       Specification.specification_name, 
       decode(Specification.course, 'BIT', 0.9, 'MIT', 0.9, 1)
         * Specification.fee AS "DISCOUNTED FEE"
  FROM Student
  JOIN Specification ON Student.specification_id = Specification.specification_id;

【讨论】:

谢谢,这正是我想要做的。

以上是关于将 CASE 与表连接一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将函数与表连接起来,并将表列作为参数传递给雪花中的函数

oracle表之间的连接

SQLAlchemy ORM如何将查询与表连接起来

Oracle表与表之间的连接方式(内连接:inner join 外连接 全连接: full outer join左连接:left outer join 右连接:right outer join(代码

Pentaho ETL:数据库连接与表输入

KSQLDB - 从 debezium cdc 源连接器获取数据并将 Stream 与表连接