【问题标题】:Case in Select Statement issue?选择语句问题中的案例?
【发布时间】:2017-02-04 21:21:31
【问题描述】:

我通常会在 java 中使用流行的 if-else 语句,但在 sqlplus 中我使用 select 语句中的 case 来查询我在下面的条件语句。

 select title, to_char(nvl2(((retail-cost)/cost)*100, 
        ((retail-cost)/cost)*100, 
        ((retail-cost)/cost)*100), '99999.99') "Margin",
        to_char(discount, '99999.99') "Discount",
 (case when ("Margin" >= 60) then 'Very High Profit'
       when ("Margin" >= 30) then 'High Profit'
       else ("Margin" >= 0)  then 'Loss Leader' 
       end) "Pricing Structure"
    from books
    order by title;

我希望得到这样的结果,但我试图移动排序;我仍然每次都遇到错误。

TITLE                          Margin   Discount  Pricing Structure
------------------------------ -------- --------- ---------------------------------
BIG BEAR AND LITTLE DOVE          68.23           Very high profit
BODYBUILD IN 10 MINUTES A DAY     65.07           Very high profit

【问题讨论】:

  • 这是错误的做法——难以编写、阅读和维护。相反,应该有一个小表,其中包含每个“定价结构”的阈值及其描述;只计算查询中的边距并加入这个小表。这样您就可以非常轻松地添加或删除级别、更改阈值和/或更改描述。

标签: sql oracle case


【解决方案1】:

sql 看不到别名,除非它在子查询中。你应该这样写:

case 
when (retail-cost/cost)*100 >= 60 then 'Very High Profit'
when (retail-cost/cost)*100 >= 30 then 'High Profit'
when  (retail-cost/cost)*100 >= 0  then 'Loss Leader' 
else 'SOMETHING HERE'
end "Pricing Structure"

还有一点需要考虑的是这个 nvl2:

to_char(nvl2(((retail-cost)/cost)*100, 
    ((retail-cost)/cost)*100, 
    ((retail-cost)/cost)*100), '99999.99')

对你没有任何帮助。为什么?导致 nvl2(exp1,exp2,exp3)。如果 exp1 不为空,则打印 exp2,如果为空,则打印 exp3。不仅如此,你的 NVL 在这里什么也不做,因为它总是输出 ((retail-cost)/cost)*100。你最好写to_char(((retail-cost)/cost)*100),'99999.99')

如果你的 exp1 = exp2 那么你最好只写 NVL(exp1,exp2)。如果 exp1 不为 null 则打印,否则打印 exp2。

【讨论】:

  • 折扣列的某些值为空,所以如果根本没有折扣;它仍然会在这里计算这个 ((retail-cost)/cost)*100 这个。
  • 我想你把我弄糊涂了。我最后给出的描述是针对保证金计算的。
  • 对不起。请忽略我之前的评论。我只记得折扣计算不包含在保证金列中。我将尝试绕过您建议的部分,我不必使用 nvl2 并直接进行计算。我在案例部分太分心了,我忘记了那一点信息嘿嘿。
  • 我很感激这个指南,非常感谢你。它有效!
【解决方案2】:

您不能在案例陈述中使用别名“Margin”。您可以在案例陈述中使用“保证金”的整个公式,例如:

(case(Margin的NVL语句)>60)

另外,请确保在您的 case 语句中匹配相同的数据类型。因此,您不能使用 to_char( ) > 60,因为您将字符与整数进行比较。

希望这可能会有所帮助:-)

【讨论】:

    【解决方案3】:

    使用公用表表达式 (CTE) 从案例逻辑中提取计算:

    WITH CDATA AS (select title,
                          ((retail-cost)/cost)*100 AS MARGIN,
                          to_char(discount, '99999.99') AS "Discount"
                     from books)
    SELECT TITLE,
           TO_CHAR(MARGIN, '99999.99') AS "Margin",
           "Discount",
           case
             when MARGIN >= 60 then 'Very High Profit'
             when MARGIN >= 30 then 'High Profit'
             else MARGIN >= 0  then 'Loss Leader' 
           end AS "Pricing Structure"
      order by title;
    

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2012-11-10
      • 2020-12-13
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多