sql - Oracle SQL - CASE WHEN THEN ELSE 忽略 ELSE 部分

标签 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 (如果不为空) else LP_BASIC (永远不会为空)。

问题是,“ ELSE f.LP_BASIC ”-部件不工作。
它应该返回 LP_BASIC 值 , 如果没有 LP_NEW 找到记录,但它只返回一个空字段。
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”不起作用。

最佳答案

(这对于评论来说太长了,因此作为答案发布)

正如评论中已经提到的,您的 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

关于sql - Oracle SQL - CASE WHEN THEN ELSE 忽略 ELSE 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40382704/

相关文章:

mysql - 如何使我的 MySQL 语句具有 limit 和 group by 的子查询?

java - MySQL检查表是否有一些记录被改变

sql - 行集中、周期日期

oracle - 为什么即使禁用并行 DML 和并行 DDL 也会创建并行 session

c# - 仅当使用 System.Data.OracleClient 时,函数才保持 INVALID,通过 SQL Developer 工作

SQL:在 varchar 字符串中插入换行符

mysql - 错误代码 1241

mysql - 使用 MySQL Case 比较日期

sql - 使用 if 语句如何替换值

hadoop - 在 Hive 的 case 语句中插入数据