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