【问题标题】:SQL CASE ExpressionSQL CASE 表达式
【发布时间】:2020-07-03 22:50:03
【问题描述】:

我需要编写一个 sql 语句(Oracle),我可以在其中从两个差异表中提取数据并检查条件并返回某个字符串。 我的陈述是这样的,

Select review.comments as comments,resort.resortid,resort.resortname 
case review.comments 
when resort.starrating>=4.5 and resort.starrating<5 then 'Excellent'
when resort.strarating>=4 and resort.starrating<4.5 then 'Great'
else 'Good'
end
from review, resort 
order by resort.resortid;

当我运行它时,我得到一个错误:“FROM 关键字未在预期的位置找到”并指向第 2 行中的 c。 如果我将 from 更改为第 2 行,则会出现错误:“SQL 命令未正确结束”。并指向“case review.cmets”中的第 3 r 行

【问题讨论】:

  • 这是CASE 表达式,不是函数
  • 您的隐式连接缺少关联两个表的条​​件。在这里,您正在对两个数据集进行笛卡尔积。
  • 您在大小写之前缺少一个逗号。
  • @Sami 好的。我是新来的。对不起。

标签: sql oracle select case


【解决方案1】:

您需要一个 JOIN 聚合,并修复 CASE 表达式语法。我假设你想要这样的东西:

Select res.resortid, res.resortname, 
       (case when avg(rev.starrating) >= 4.5 then 'Excellent'
             when avg(rev.starrating) >= 4 then 'Great'    
            else 'Good'
        end) as category
from review rev join
     resort res
     on rev.resortid = res.resortid
group by res.resortid, res.resortname 
order by res.resortid;

【讨论】:

    【解决方案2】:

    您正在混合case 语法的两种变体。如果您要提供条件(而不仅仅是值),则不应在 case 关键字之后使用表达式:

    case -- review.comments should be removed from here
    when resort.starrating>=4.5 and resort.starrating<5 then 'Excellent'
    when resort.strarating>=4 and resort.starrating<4.5 then 'Great'
    else 'Good'
    end
    

    【讨论】:

      【解决方案3】:

      case 的语法是

      CASE
          WHEN condition1 THEN result1
          WHEN condition2 THEN result2
          WHEN conditionN THEN resultN
          ELSE result
      END;
      

      所以你的代码应该是这样的..

      SELECT review.comments AS comments, 
                 resort.resortid, 
                 resort.resortname, 
                 CASE
                   WHEN resort.starrating >= 4.5 
                        AND resort.starrating < 5 THEN 'Excellent' 
                   WHEN resort.strarating >= 4 
                        AND resort.starrating < 4.5 THEN 'Great' 
                   ELSE 'Good' 
                 END 
      
          FROM   review, 
                     resort 
                 ORDER  BY resort.resortid;
      

      也仅供参考,两个表之间的逗号表示CROSS JOIN

      所以你的查询相当于:

      select * from
      FROM   review
             CROSS JOIN resort
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 2012-09-20
        • 1970-01-01
        • 2023-03-16
        • 2012-10-03
        相关资源
        最近更新 更多