Oracle SQL - 那么当ELSE忽略ELSE部分时

时间:2016-11-02 14:39:28

标签: sql oracle case

我的sql查询有问题,不知道如何解决它:

输出表由。

组成
1. SERIALNR   VARCHAR(26) NOT NULL
2. LP_BASIC   VARCHAR(20) NOT NULL
3. LP_NEW     VARCHAR(20)
4. SCORE      NUMBER(20)  NOT NULL
5. CURRENT_LP VARCHAR(20)

查询本身运行良好且不包含任何错误。

LP_BASIC 列始终填充,而 LP_NEW 是可选字段。 CURRENT_LP 应始终显示 LP_NEW (如果不为空),否则 LP_BASIC (永远不会为空)。

问题是,“ ELSE f.LP_BASIC ” - 部分无效。 如果找不到 LP_NEW 记录,它应该返回 LP_BASIC值,而只返回一个空字段。

SELECT 
  f.SERIALNR,
  f.LP_BASIC,
  f.LP_NEW, 
  f.SCORE,
  CASE
    WHEN
      f.LP_NEW
      IS NOT NULL
        THEN
          f.LP_NEW
    ELSE
      f.LP_BASIC
  END
AS CURRENT_LP 
FROM (
        SELECT 
          SERIALNR, 
          MAX(SCORE) MAX_ID
        FROM 
          EAPS.PS_TC_SM 
        GROUP BY 
          SERIALNR
     ) x 
INNER JOIN 
  EAPS.PS_TC_SM f 
ON 
  f.SERIALNR=
  x.SERIALNR 
AND 
  f.SCORE = 
  x.MAX_ID

任何有助于帮助的人。

提前谢谢。

罗布。

更新(已解决)

LP_NEW列不为空,其中有一个空格字符,因此“IS NULL”不起作用。

2 个答案:

答案 0 :(得分:2)

(这个评论太长了,因此张贴了答案)

正如评论中已经提到的,您的CASE声明非常好;你应该重新检查你的输入数据。

使用虚假数据证明您的方法正确性的示例:

with v_input(serialnr, lp_basic, lp_new) as (
  select 
    level, 
    'basic_' || to_char(level), 
    (case when mod(level, 2) = 0 then 'new_' || to_char(level) else null end)
  from dual
  connect by level <= 10)
SELECT 
  f.SERIALNR,
  f.LP_BASIC,
  f.LP_NEW, 
  CASE
    WHEN
      f.LP_NEW
      IS NOT NULL
        THEN
          f.LP_NEW
    ELSE
      f.LP_BASIC
  END
AS CURRENT_LP 
FROM v_input f

答案 1 :(得分:-1)

尝试使用oracle NVL函数,实际上它将选择指定的值,如果为null,则它将选择辅助值。

SELECT NVL(LP_NEW,LP_BASIC)

https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm