oracle SQL基于条件的多个IF语句

6pp0gazn  于 2023-01-12  发布在  Oracle
关注(0)|答案(3)|浏览(297)

在Oracle SQL中,根据现有列的值和其他条件计算值并存储它们的最佳方法是什么?
例如:
如果第1列的值=〉3,则结果应默认为该列的值。
但是,如果第1列的值〈3,第2列的值为1,第3列、第4列和第5列都有值,则该值应默认为2
如果第1列值小于3,第2列填充值为1,第4列、第5列有值,但第3列没有值,则默认值为2
如果第1列的值〈3,第2列填充的值为1,第3列和第4列有值,但第5列没有值,则对于填充的第3、4、5列的所有情形,默认值为1 ......等等
如果列1具有〈3的值,列2填充有值2,列3、列4和列5都具有值,则对于所有情形,该值应当默认为3等。
只是想知道最简单的方法去制定它,因为有无数的条件(19个条件是准确的)

ykejflvf

ykejflvf1#

除了你的一般判断力,我会使用一个案件时,把你的第一个标准第一,然后继续与后续的下一个优先条件。

-- column1 is >= 3, use it as first.
case when column1 >= 3
          then column1
-- if it gets this far, then column1 is LESS than 3
     when column1 < 3
      AND column2 = 1
      AND column3 = column4 
      AND column3 = column5
     then column2

    when column1 < 3
      AND column2 = 1
      etc
    then ...
    else ... last choice
end

将WHEN条件保留在应该处理它们的优先级中。

z3yyvxxp

z3yyvxxp2#

我不知道你的一些条件是什么(“etc etc”),但其中一些条件(如2和3)是相同的,我怀疑你有19个条件。
您需要知道哪些条件具有优先级。
下面是基于您所提供的内容的查询的基本代码结构。

select
  case
    when col1 >= 3 then col1
    else 
      case
        when col2 = 1 and not null in (col4, col5) then 2
        when col2 = 1 and not null in (col3, col4) and col5 is null then 1
        when col2 = 2 and not null in (col3, col4, col5) then 3
        else null -- col2 not in (1,2)
      end
  end

存储它们的方式如下:

insert into my_table (mycolumn)

select
  case
    when col1 >= 3 then col1
    else
      case
        when col2 = 1 and not null in (col4, col5) then 2
        when col2 = 1 and not null in (col3, col4) and col5 is null then 1
        when col2 = 2 and not null in (col3, col4, col5) then 3
        else null -- col2 not in (1,2)
      end
  end
vlju58qv

vlju58qv3#

使用CASE表达式时要小心,因为它是按顺序工作的,并且在第一个结果为TRUE时退出。因此,条件的顺序至关重要。

WITH
    tbl (C1, C2, C3, C4, C5) AS
        (
            Select 1, 1, 3, 4, 5 From Dual Union All
            Select 1, 1, 3, 3, 5 From Dual Union All
            Select 1, 1, 3, 3, Null From Dual Union All
            Select 2, 2, 3, 3, 5 From Dual Union All
            Select 2, 2, 3, Null, Null From Dual Union All
            Select 2, 2, Null, Null, Null From Dual Union All
            Select 4, 2, 3, 3, 5 From Dual
        )
Select t.*,
    CASE 
        WHEN C1 >= 3 THEN C1
    ELSE
        CASE 
            WHEN C2 = 1 And     C3 Is Not Null And      C4 Is Not Null And      C5 Is Not Null THEN 2
            WHEN C2 = 1 And     C3 Is Null And          C4 Is Not Null And      C5 Is Not Null THEN 2
            WHEN C2 = 1 And     C3 Is Not Null And      C4 Is Not Null And      C5 Is Null THEN 1
            WHEN C2 = 1 And     C3 Is Not Null And      C4 Is Null And          C5 Is Null THEN 1
            --
            WHEN C2 = 2 And     C3 Is Not Null And      C4 Is Not Null And      C5 Is Not Null THEN 3
            WHEN C2 = 2 And     C3 Is Null And          C4 Is Not Null And      C5 Is Not Null THEN 3
            WHEN C2 = 2 And     C3 Is Not Null And      C4 Is Not Null And      C5 Is Null THEN 2
            WHEN C2 = 2 And     C3 Is Not Null And      C4 Is Null And         C5 Is Null THEN 2
        ELSE 
            -1
        END
    END "RESULT"
From tbl t
Order By 1

R e s u l t :
        C1         C2         C3         C4         C5     RESULT
---------- ---------- ---------- ---------- ---------- ----------
         1          1          3          4          5          2 
         1          1          3          3          5          2 
         1          1          3          3                     1 
         2          2          3          3          5          3 
         2          2          3                                2 
         2          2                                          -1 
         4          2          3          3          5          4

结果-1表示没有匹配条件

相关问题