【问题标题】:Oracle SQL - CASE WHEN THEN ELSE ignoring ELSE partOracle SQL - CASE WHEN THEN ELSE 忽略 ELSE 部分
【发布时间】:2017-03-15 22:16:38
【问题描述】:

我的 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”不起作用。

【问题讨论】:

  • 请发布一些示例数据、所需结果以及您从查询中得到的结果
  • 这不是更容易阅读吗? coalesce(f.LP_NEW ,f.LP_BASIC)
  • @Kritner Coalesce 更好。 Nvl 比较两个值,coalesce 在找到值后立即停止。
  • 你确定 lp_new 实际上是空的,而且里面没有空格吗?
  • 我倾向于同意 DCookie,并预测 NVL()COALESCE() 都无法解决问题。如果NVL()COALESCE() 会修复任何CASE 的错误,那将是非常奇怪的,因为它们在逻辑上是等价的——在实现上的差异使得CASECOALESCE()NVL() 快一点一些情况。

标签: sql oracle case


【解决方案1】:

尝试使用oracle NVL函数,本质上它会选择指定的值,如果它为null,那么它将选择辅助值。

SELECT NVL(LP_NEW,LP_BASIC)

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

【讨论】:

  • 这完全等同于CASE的方法,并不能解决OP的问题。
【解决方案2】:

(评论太长,因此作为答案发布)

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

【讨论】:

  • 谢谢。所有 LP_NEW 记录中都有一个空格字符阻止 CASE 语句工作,所以我将 IS NULL 更改为 = ' ' 现在整个事情按预期工作。我是 sql 新手,没想到会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2020-11-14
  • 2015-11-02
相关资源
最近更新 更多