Oracle SQL - 从案例

时间:2018-05-07 10:33:06

标签: sql oracle case

我可能会错误地尝试。我正在寻找最好的方法。

要求:

我的查询基于少数字段加入4-5个表。

我有一个名为product id的列。在我的表中有150万行。其中只有10%的行具有带有以下属性的产品ID

A300X-%
A500Y-%

300,500,700是有效的型号。 X和Y是分类。我的查询选择了所有系统。

我有一张支票如下

CASE
WHEN PID LIKE 'A300X%'
THEN 'A300' 
...
END AS MODEL

类似地

CASE
WHEN PID LIKE 'A300X%'
THEN 'X'
...
END AS GENRE

我正在寻找下面的最佳选择

  1. 如何结合两个案例陈述并添加另外[第三个]案例,这两个案例将具有这两种情况。即
  2. CASE 
        WHEN desc in ('AAA')
             First Case
             Second Case
        ELSE
             don't do anything for other systems
        END
    
    1. 这有什么正则表达方式吗?在第一次之前 - 拿字符串。寻找X,Y以及300,500,700。

    2. 还有其他办法吗?或者通过代码做最好的方法?

    3. 有什么建议吗?

      修改

      示例desc:

      AAA,
      SoftwARE, 
      sw-app
      

      我的查询选择了所有的desc。但是这个案子应该只针对AAA运行。

      有效型号

      A300X-2x-P
      A500Y-5x-p
      A700X-2x-p
      A50CE-2x-P
      

      我只需考虑300,500,700。以上两种情况。

      预期结果:

      MODEL     GENRE
      A300      X
      A500      Y
      A300      Y
      

2 个答案:

答案 0 :(得分:2)

问:如何结合CASE 语句表达式

每个CASE表达式将返回单个值。如果要求是在结果集中返回两个单独的列,则需要在SELECT列表中使用两个单独的表达式。

例如:

DESC  PID           model_number  genre
----  ----------    ------------  ------
AAA   A300X-2x-P    300           X 
AAA   A500Y-5x-p    500           Y
AAA   A700X-2x-p    700           X
AAA   A50CE-2x-P    (NULL)        (NULL)
FOO   A300X-2x-P    (NULL)        (NULL)

需要有一个表达式来返回model_number列,并使用单独的表达式返回genre列。

单个表达式无法返回两个单独的列。

问:并添加另外[第三]案件,这将包含这两种情况。

CASE表达式返回一个值;我们几乎可以在SQL语句的任何地方使用CASE表达式,我们可以使用一个值,包括在另一个CASE表达式中。

我们还可以将WHEN测试中的多个条件与ANDOR

结合起来

作为组合条件和嵌套CASE表达式的例子...

 CASE 
 WHEN (    ( t.PID LIKE '_300%'  OR t.PID LIKE '_500%'  OR t.PID LIKE '_700%' )
       AND ( t.DESC = 'AAA' )
      )
 THEN CASE 
        WHEN ( t.PID LIKE '____X%' )
        THEN 'X'
        WHEN ( t.PID LIKE '____Y%' )
        THEN 'Y'
        ELSE NULL
      END
 ELSE NULL
 END AS `genre`

还有其他表达式会返回相同的结果;这里显示的例子不一定是最好的表达方式。它只是用于组合条件和嵌套CASE表达式的演示。

请注意,要返回另一列model,我们需要在SELECT列表中包含另一个表达式。类似的情况需要重复;它无法在另一个WHEN表达式中引用CASE条件。

答案 1 :(得分:1)

根据您的示例数据,这样的逻辑可以起作用:

(CASE WHEN REGEXP_LIKE(PID, '^A[0-9]{3}[A-Z]-')
      THEN SUBSTR(PID, 1, 4)
      ELSE PID
 END) AS MODEL

(CASE WHEN REGEXP_LIKE(PID, '^A[0-9]{3}[A-Z]-')
      THEN SUBSTR(PID, 5, 1)
      ELSE PID
 END) AS GENRE

这假定“型号”始终以“A”开头,后跟三位数字(如示例数据中所示)。如果型号更复杂,您可能需要regexp_substr()来提取所需的值。